BlameableBehavior เป็น behavior ใน Model มีไว้สำหรับการบันทึกผู้ Create และ Update โดยอัตโนมัติ เวลาที่เพิ่มข้อมูลจะนำ id ของ user ที่ login บันทึกลง created_by และ updated_by โดยอัตโนมัติ หากไม่มี User Login จะ return ค่าเป็น null
https://github.com/yiisoft/yii2/blob/master/framework/behaviors/BlameableBehavior.php
รูปแบบการใช้งาน
use yii\behaviors\BlameableBehavior;
//...
public function behaviors()
{
return [
BlameableBehavior::className(),
];
}
//...
หรือระบุ attribute เฉพาะ หาก attribute ไม่ใช่ created_by และ updated_by
//...
public function behaviors()
{
return [
[
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'author_id',
'updatedByAttribute' => 'updater_id',
],
];
}
//...
ตัวอย่าง
ตัวอย่างการใช้งาน BlameableBehavior สำหรับ attribute ที่ไม่ใช้ created_by และ updated_by
<?php
namespace common\models;
use common\models\User;
use yii\behaviors\BlameableBehavior;
class Post extends \yii\db\ActiveRecord
{
public static function tableName()
{
return 'blog_post';
}
public function behaviors()
{
return [
[
'class' => BlameableBehavior::className(),
'createdByAttribute' => 'author_id',
'updatedByAttribute' => 'updater_id',
],
];
}
public function rules()
{
return [
[['title', 'content', 'status', 'author_id'], 'required'],
[['status', 'create_time', 'update_time', 'author_id', 'updater_id'], 'integer'],
[['content', 'tags'], 'string'],
[['title'], 'string', 'max' => 128]
];
}
public function attributeLabels()
{
return [
'id' => 'ID',
'title' => 'Title',
'content' => 'Content',
'tags' => 'Tags',
'status' => 'Status',
'create_time' => 'Create Time',
'update_time' => 'Update Time',
'author_id' => 'เขียนโดย',
'updater_id' => 'แก้ไขโดย',
];
}
/*
* สร้าง Relation
*
*/
public function getAuthor(){
return $this->hasOne(User::className(), ['id' => 'author_id']);
}
public function getUpdater(){
return $this->hasOne(User::className(), ['id' => 'updater_id']);
}
}
ทดลอง Login แล้วบันทึกข้อมูลผ่าน Form จะเห็นว่ามีข้อมูลเกิดขึ้นที่ author_id และ updater_id ซึ่งเป็น id ของ User ที่กำลัง Login
การเรียกข้อมูลผ่าน Relation
การใช้งาน โดยสามารถเรียกข้อมูลจากการทำ Relation ใน Model โดยมีตัวอย่างการเรียกใช้งานดังนี้
DetailView
<?= DetailView::widget([
'model' => $model,
'attributes' => [
//'id',
'title',
'content',
'tags'
'create_time:dateTime',
'update_time:dateTime',
[
'attribute' => 'author_id',
'value' => $model->author->username,
],
[
'attribute' => 'updater_id',
'value' => $model->updater->username,
]
],
]) ?>
ความคิดเห็น