yii2
Aktiv post
Sök…
Anmärkningar
AR är perfekt när du behöver radera, uppdatera eller skapa en eller flera poster i följd. Dess stöd för smutsiga attribut (sparar bara det som verkligen förändrats) resulterar i optimerade UPDATE-uttalanden som lyfter belastningen från databasen avsevärt och minskar chansen för olika konflikter i samband med redigering av samma post av flera personer samtidigt.
Om du inte har riktigt komplex logik i din applikation och därför inte kräver abstraherande enheter, är AR den bästa passningen för att ta bort, uppdatera och skapa.
AR är också OK för enkla frågor som resulterar i under 100 poster per sida. Det är inte lika performant som att arbeta med matriser producerade av frågeställare eller asArray () men det är mer nöje att arbeta med.
AR rekommenderas inte för komplexa frågor. Dessa handlar vanligtvis om att aggregera eller omvandla data så att det som returneras inte passar AR-modellen i alla fall. Det är att föredra att använda frågeställare i detta fall.
Samma sak gäller import och export. Bättre att använda frågeställaren på grund av stora mängder data och eventuellt komplexa frågor.
Hitta alla poster
Post::find()->all();
// SELECT * FROM post
eller korthaven
(Returnerar en aktiv instans för modellinstans med en primär nyckel eller en matris med kolumnvärden.)
Post::findAll(condition);
returnerar en rad ActiveRecord-instanser.
Hitta alla med skick
$model = User::find()
->where(['id' => $id])
->andWhere('status = :status', [':status' => $status])
->all();
Hitta alla med orderBy
$model = User::find()
->orderBy(['id'=>SORT_DESC])
->all();
Or
$model = User::find()
->orderBy(['id'=>SORT_ASC])
->all();
Där klausul
OPERATÖRER
$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'
I
$postsInArray = Post::find()->where(['id' => [1,2,3]])->all();
// SELECT * FROM post WHERE id IN (1,2,3)
MELLAN
$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
OCH
$postsAND = Post::find()->where(['title' => null, 'body' => null]);
// SELECT * FROM post WHERE title IS NULL AND body IS NULL
ELLER
$postsAND = Post::find()->where(['OR', 'title IS NULL', 'body IS NULL']);
// SELECT * FROM post WHERE title IS NULL OR body IS NULL
INTE
$postsNotEqual = Post::find()->where(['NOT', ['created_at'=>'2016-01-25']])->all();
// SELECT * FROM post WHERE created_at IS NOT '2016-01-25'
NEDED 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)
Gillar operatör med filterWhere activerecord metoder
I sökfiltret vill du till exempel filtrera inlägget genom att klippa in posttitel eller beskrivning som har lagts in av för närvarande inloggad användare.
$title = 'test';
$description = 'test';
i) andFilterWhere ()
$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) ellerFilterWhere ()
$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
Obs! När vi använder filterWhere () måste vi ringa alla andwhere () eller orWhere () efter filterWhere () annars kommer alla förhållanden att ta bort utom filterWhere ()
Skapa en ActiveRecord-klass med händelsebaserade fältvärde
<?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'),
]
];
}
}
Eller detta kan användas
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);
}
Hitta en post
$customer = Customer::findOne(10);
eller
$customer = Customer::find()->where(['id' => 10])->one();
eller
$customer = Customer::find()->select('name,age')->where(['id' => 10])->one();
eller
$customer = Customer::findOne(['age' => 30, 'status' => 1]);
eller
$customer = Customer::find()->where(['age' => 30, 'status' => 1])->one();
Hitta en fråga
Hitta enskild post baserad på id.
$model = User::findOne($id);
Välj en kolumn baserad på id.
$model = User::findOne($id)->name;
Hämta enskild post från databasen baserat på villkor.
$model = User::find()->one(); // give first record
$model = User::find()->where(['id' => 2])->one(); // give single record based on id
Välj enstaka kolumnposter från databasen baserat på villkor.
$model = User::find()->select('name,email_id')->where(['id' => 1])->one();
ELLER
$model = User::find()->select(['id','name','email_id'])->where(['id' => 1])->one();
Sortera efter
$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();
Aktiva poster med subfrågor
Exempel: Kunder som kan skapa ett inlägg. Varje kund kan skapa flera inlägg. Så fort kunden skapar inlägget kommer inlägg att granskas av administratörer. Nu måste vi hämta kundlistan som har alla aktiva inlägg med hjälp av underfrågan.
Obs: Om en kund har 5 inlägg, bland fem inlägg om han har minst en inaktiv, måste vi utesluta denna kund från kundlistan.
$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