yii2
Активная запись
Поиск…
замечания
AR идеально подходит, когда вам нужно удалить, обновить или создать одну или несколько записей последовательно. Его поддержка грязных атрибутов (сохранение только того, что было действительно изменено) приводит к оптимизированным операторам UPDATE, которые значительно увеличивают нагрузку на базу данных и уменьшают шансы на различные конфликты, связанные с одновременным редактированием одной записи несколькими лицами.
Если у вас нет сложной логики в вашем приложении, и поэтому она не требует абстрагирования сущностей, AR лучше всего подходит для удаления, обновления и создания.
AR также подходит для простых запросов, результатом чего является менее 100 записей на странице. Это не так эффективно, как работа с массивами, создаваемыми конструктором запросов или asArray (), но с большим удовольствием работать.
AR не рекомендуется для сложных запросов. Обычно это связано с агрегацией или преобразованием данных, поэтому возвращаемое не соответствует модели AR. В этом случае предпочтительнее использовать построитель запросов.
То же самое касается импорта и экспорта. Лучше использовать построитель запросов из-за большого количества данных и, возможно, сложных запросов.
Найти все записи
Post::find()->all();
// SELECT * FROM post
или сокращенное
(Возвращает экземпляр активной модели записи с помощью первичного ключа или массива значений столбца.)
Post::findAll(condition);
возвращает массив экземпляров ActiveRecord.
Найти все с помощью условия
$model = User::find()
->where(['id' => $id])
->andWhere('status = :status', [':status' => $status])
->all();
Найти все с orderBy
$model = User::find()
->orderBy(['id'=>SORT_DESC])
->all();
Or
$model = User::find()
->orderBy(['id'=>SORT_ASC])
->all();
Где пункт
ОПЕРАТОРЫ
$postsGreaterThan = Post::find()->where(['>', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at > '2016-01-25'
$postsLessThan = Post::find()->where(['<', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at < '2016-01-25'
$postsNotEqual = Post::find()->where(['<>', 'created_at', '2016-01-25'])->all();
// SELECT * FROM post WHERE created_at <> '2016-01-25'
В
$postsInArray = Post::find()->where(['id' => [1,2,3]])->all();
// SELECT * FROM post WHERE id IN (1,2,3)
МЕЖДУ
$postsInBetween = Post::find()
->where(['between', 'date', "2015-06-21", "2015-06-27" ])
->all();
НОЛЬ
$postsWithNullTitle = Post::find()->where(['title' => null]);
// SELECT * FROM post WHERE title IS NULL
А ТАКЖЕ
$postsAND = Post::find()->where(['title' => null, 'body' => null]);
// SELECT * FROM post WHERE title IS NULL AND body IS NULL
ИЛИ ЖЕ
$postsAND = Post::find()->where(['OR', 'title IS NULL', 'body IS NULL']);
// SELECT * FROM post WHERE title IS NULL OR body IS NULL
НЕ
$postsNotEqual = Post::find()->where(['NOT', ['created_at'=>'2016-01-25']])->all();
// SELECT * FROM post WHERE created_at IS NOT '2016-01-25'
НЕЗАВИСЛЕННЫЕ КЛАССЫ
$postsNestedWhere = Post::find()->andWhere([
'or',
['title' => null],
['body' => null]
])->orWhere([
'and',
['not', ['title' => null]],
['body' => null]
]);
// SELECT * FROM post WHERE (title IS NULL OR body IS NULL) OR (title IS NOT NULL AND body IS NULL)
КАК ОПЕРАТОР с фильтром.
Например, в поисковом фильтре вы хотите отфильтровать сообщение, обжигая заголовок или описание, опубликованные в настоящее время вошедшим в систему пользователем.
$title = 'test';
$description = 'test';
i) иFilterWhere ()
$postLIKE = Post::find()->where(['user_id' => Yii::$app->user->getId()])->andfilterWhere(['or', ['title' => $title, 'description' => $description]])->all();
//SELECT * FROM post WHERE user_id = 2 AND ((`title` LIKE '%test%') OR (`description` LIKE '%test%'))
ii) илиFilterWhere ()
$postLIKE = Post::find()->where(['user_id' => Yii::$app->user->getId()])->orFilterWhere(['or', ['title' => $title, 'description' => $description]])->all();
//SELECT * FROM post WHERE user_id = 2 OR ((`title` LIKE '%test%') OR (`description` LIKE '%test%'))
iii) filterWhere ()
$postLIKE = Post::find()->filterWhere(['AND', ['title' => $title, 'description' => $description]])->andWhere(['user_id' => Yii::$app->user->getId()])->all();
//SELECT * FROM post WHERE ((`title` LIKE '%test%') AND (`description` LIKE '%test%')) AND user_id = 2
Примечание. При использовании filterWhere () мы должны вызывать все andwhere () или orWhere () после фильтраWhere () в противном случае все, где будут удалены условия, кроме filterWhere ()
Создайте класс ActiveRecord с знаками полей на основе событий
<?php
namespace models;
use yii\db\ActiveRecord;
use yii\behaviors\TimestampBehavior;
class Post extends ActiveRecord
{
public static function tableName()
{
return 'post';
}
public function rules() {
return [
[['created_at', 'updated_at'], 'safe'],
];
}
public function behaviors() {
parent::behaviors();
return [
'timestamp' => [
'class' => TimestampBehavior::className(),
'attributes' => [
ActiveRecord::EVENT_BEFORE_INSERT => ['created_at', 'updated_at'],
ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at']
],
'value' => date('Y-m-d H:i:s'),
]
];
}
}
Или это можно использовать
public function beforeSave($insert)
{
if($this->isNewRecord){
//When create
}else{
//When update
}
return parent::beforeSave($insert);
}
public function afterSave($insert, $changedAttributes )
{
if($insert){
//When create
}else{
//When update
}
return parent::afterSave($insert, $changedAttributes);
}
Найти одну запись
$customer = Customer::findOne(10);
или же
$customer = Customer::find()->where(['id' => 10])->one();
или же
$customer = Customer::find()->select('name,age')->where(['id' => 10])->one();
или же
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
или же
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
Поиск по одному запросу
Найдите одиночную запись на основе идентификатора.
$model = User::findOne($id);
Выберите один столбец на основе идентификатора.
$model = User::findOne($id)->name;
Извлеките одну запись из базы данных на основе условия.
$model = User::find()->one(); // give first record
$model = User::find()->where(['id' => 2])->one(); // give single record based on id
Выберите запись одиночных колонок из базы данных на основе условия.
$model = User::find()->select('name,email_id')->where(['id' => 1])->one();
ИЛИ ЖЕ
$model = User::find()->select(['id','name','email_id'])->where(['id' => 1])->one();
Сортировать по
$model = User::find()->select(['id','name','email_id'])->orderBy(['id' => SORT_DESC])->one();
OR
$model = User::find()->select(['id','name','email_id'])->orderBy(['id' => SORT_ASC])->one();
Активные записи с подзапросами
Пример: клиенты, которые могут создать сообщение. Каждый клиент может создавать несколько сообщений. Как только клиент создаст сообщение, сообщение будет просмотрено администраторами. Теперь нам нужно получить список клиентов, у которых есть все активные сообщения, используя подзапрос.
Примечание. Если у клиента 5 сообщений, среди 5 должностей, если у него есть хотя бы один неактивный, мы должны исключить этого клиента из списка клиентов.
$subQuery = Post::find()->select(['customer_id'])->where(['status' => 2]); //fetch the customers whos posts are inactive - subquery
$query = Customer::find()->where(['NOT IN', 'id', $subQuery])->all(); //Exclude the customers whos posts are inactive by using subquery