Поиск…


замечания

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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow