Buscar..


Observaciones

AR es perfecto cuando necesita eliminar, actualizar o crear uno o más registros secuencialmente. Su compatibilidad con los atributos sucios (al guardar solo lo que realmente se cambió) da como resultado declaraciones de ACTUALIZACIÓN optimizadas que elevan la carga de la base de datos de manera significativa y reducen las posibilidades de varios conflictos relacionados con la edición del mismo registro por varias personas al mismo tiempo.

Si no tiene una lógica realmente compleja en su aplicación y, por lo tanto, no requiere entidades abstractas, AR es la mejor opción para eliminar, actualizar y crear.

AR también está bien para consultas simples que resultan en menos de 100 registros por página. No es tan eficaz como trabajar con matrices producidas por el generador de consultas o asArray () pero es más placentero trabajar con ellas.

AR no es recomendable para consultas complejas. Por lo general, se trata de agregar o transformar datos, por lo que lo que se devuelve no se ajusta al modelo AR de todos modos. Es preferible utilizar el generador de consultas en este caso.

Lo mismo ocurre con la importación y exportación. Es mejor utilizar el generador de consultas debido a las grandes cantidades de datos y posiblemente a las consultas complejas

Encontrar todos los registros

Post::find()->all();
// SELECT * FROM post

o la taquigrafía

(Devuelve una instancia de modelo de registro activo mediante una clave principal o una matriz de valores de columna).

Post::findAll(condition);

devuelve una matriz de instancias de ActiveRecord.

Encuentra todos con donde Condición

$model = User::find()
        ->where(['id' => $id])
        ->andWhere('status = :status', [':status' => $status])
        ->all();

Encuentra a todos con el pedido por

$model = User::find()
         ->orderBy(['id'=>SORT_DESC])
        ->all();
Or

$model = User::find()
         ->orderBy(['id'=>SORT_ASC])
        ->all();

Dónde cláusula

Los operadores

$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'

EN

$postsInArray = Post::find()->where(['id' => [1,2,3]])->all();
// SELECT * FROM post WHERE id IN (1,2,3)

ENTRE

$postsInBetween = Post::find()
->where(['between', 'date', "2015-06-21", "2015-06-27" ])
->all();

NULO

$postsWithNullTitle = Post::find()->where(['title' => null]);
// SELECT * FROM post WHERE title IS NULL

Y

$postsAND = Post::find()->where(['title' => null, 'body' => null]);
// SELECT * FROM post WHERE title IS NULL AND body IS NULL

O

$postsAND = Post::find()->where(['OR', 'title IS NULL', 'body IS NULL']);
// SELECT * FROM post WHERE title IS NULL OR body IS NULL

NO

 $postsNotEqual = Post::find()->where(['NOT', ['created_at'=>'2016-01-25']])->all();
// SELECT * FROM post WHERE created_at IS NOT '2016-01-25'

CLASES ANULADAS

$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)

Operador como con filtro, donde métodos de registro activo

Por ejemplo, en el filtro de búsqueda, desea filtrar la publicación al desgarrar el título de la publicación o la descripción publicada por el usuario que ha iniciado sesión actualmente.

$title = 'test';
$description = 'test';

i) yFilterWhere ()

$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) orFilterWhere ()

$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) filtroDonde ()

$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

Nota: mientras usamos filterWhere () tenemos que llamar a all ywhere () o or Where () después de filterWhere (), de lo contrario, todas las condiciones se eliminarán, excepto filterWhere ().

Crear una clase ActiveRecord con valor de campos basados ​​en eventos

    <?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'),
              ]
            ];
          }
    }

O esto puede ser usado

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);
}

Encontrar un registro

$customer = Customer::findOne(10);

o

$customer = Customer::find()->where(['id' => 10])->one();

o

$customer = Customer::find()->select('name,age')->where(['id' => 10])->one();

o

$customer = Customer::findOne(['age' => 30, 'status' => 1]);

o

$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();

Encontrar una consulta

Encuentra un solo registro basado en id.

$model = User::findOne($id);

Seleccione una sola columna basada en id.

$model = User::findOne($id)->name;

Recuperar el registro único de la base de datos en función de la condición.

$model = User::find()->one();  // give first record

$model = User::find()->where(['id' => 2])->one(); // give single record based on id

Seleccione el registro de columnas individuales de la base de datos según la condición.

$model = User::find()->select('name,email_id')->where(['id' => 1])->one();

O

$model = User::find()->select(['id','name','email_id'])->where(['id' => 1])->one();

Orden por

$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();

Registros activos con sub consultas

Ejemplo: Clientes que pueden crear una publicación. Cada cliente puede crear múltiples publicaciones. Tan pronto como el cliente cree la publicación, la publicación estará bajo la revisión de los administradores. Ahora tenemos que buscar la lista de clientes que tienen todas las publicaciones activas mediante una subconsulta.

Nota: Si un cliente tiene 5 publicaciones, entre 5 publicaciones si tiene al menos una inactiva, debemos excluir a este cliente de la lista de clientes.

$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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow