Suche…


Bemerkungen

AR ist perfekt, wenn Sie einen oder mehrere Datensätze nacheinander löschen, aktualisieren oder erstellen müssen. Durch die Unterstützung von Dirty-Attributen (nur das, was wirklich geändert wurde) werden optimierte UPDATE-Anweisungen erzielt, die die Datenbank erheblich entlasten und die Wahrscheinlichkeit für verschiedene Konflikte verringern, die mit der gleichzeitigen Bearbeitung desselben Datensatzes durch mehrere Personen zusammenhängen.

Wenn Sie in Ihrer Anwendung keine wirklich komplexe Logik haben und daher keine abstrakten Elemente benötigen, ist AR die beste Lösung für das Löschen, Aktualisieren und Erstellen.

AR ist auch für einfache Abfragen geeignet, die zu weniger als 100 Datensätzen pro Seite führen. Es ist nicht so leistungsfähig wie das Arbeiten mit Arrays, die von Query Builder oder asArray () erstellt wurden, aber es macht mehr Spaß, damit zu arbeiten.

AR wird für komplexe Abfragen nicht empfohlen. Hierbei geht es in der Regel darum, Daten zu aggregieren oder zu transformieren, sodass das zurückgegebene Ergebnis sowieso nicht in das AR-Modell passt. In diesem Fall ist es vorzuziehen, den Query Builder zu verwenden.

Gleiches gilt für Import und Export. Verwenden Sie den Query Builder wegen der großen Datenmengen und möglicherweise komplexer Abfragen.

Alle Datensätze finden

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

oder die Abkürzung

(Gibt eine aktive Datensatzmodellinstanz über einen Primärschlüssel oder ein Array von Spaltenwerten zurück.)

Post::findAll(condition);

gibt ein Array von ActiveRecord-Instanzen zurück.

Alle mit wo Zustand finden

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

Alle mit orderBy finden

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

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

Wo Klausel

BETREIBER

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

IM

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

ZWISCHEN

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

NULL

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

UND

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

ODER

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

NICHT

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

NESTED CLAUSES

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

LIKE OPERATOR with filterWhere Aktivierungsmethoden

Im Suchfilter möchten Sie beispielsweise den Beitrag nach gebranntem Beitragstitel oder einer Beschreibung filtern, die vom aktuell angemeldeten Benutzer gepostet wird.

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

i) undFilterWhere ()

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

$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

Hinweis: Bei der Verwendung von filterWhere () müssen wir all undwhere () oder orWhere () nach dem filterWhere () aufrufen, andernfalls werden alle Bedingungen entfernt, an denen die Bedingungen außer filterWhere () entfernt werden.

Erstellen Sie eine ActiveRecord-Klasse mit ereignisbasiertem Feldwert

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

Oder das kann verwendet werden

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

Einen Datensatz finden

$customer = Customer::findOne(10);

oder

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

oder

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

oder

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

oder

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

Suchen Sie eine Abfrage

Einzelnen Datensatz anhand der ID suchen

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

Wählen Sie eine einzelne Spalte basierend auf der ID aus.

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

Rufen Sie den einzelnen Datensatz je nach Bedingung aus der Datenbank ab.

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

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

Wählen Sie einen einzelnen Spaltensatz aus der Datenbank basierend auf den Bedingungen aus.

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

ODER

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

Sortieren nach

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

Aktive Datensätze mit Unterabfragen

Beispiel: Kunden, die einen Beitrag erstellen können. Jeder Kunde kann mehrere Beiträge erstellen. Sobald der Kunde die Post erstellt, wird die Post von den Administratoren geprüft. Jetzt müssen wir die Kundenliste abrufen, die alle aktiven Beiträge enthält, indem wir die Unterabfrage verwenden.

Hinweis: Wenn ein Kunde 5 Stellen hat, von denen 5 mindestens eine inaktiv hat, müssen wir diesen Kunden von der Kundenliste ausschließen.

$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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow