将属性添加到不在数据库中的 yii2 活动记录模型
我有一个 mySQL 数据库,它有一个表 videos 和两列 start_time 和 end_time,格式为 2017-01-24 15:38:11.
I have a mySQL database that has a table videos and two columns, start_time and end_time, which are in the format 2017-01-24 15:38:11.
我有一个活动记录模型 Videos 扩展了 yiidbActiveRecord,我想添加一些数据库中没有的附加属性.
I have an active record model Videos that extends yiidbActiveRecord and i would like to add a few additional attribute that are not in the database.
我正在尝试将时间戳拆分为单独的日期和时间,然后我可以将其显示为我的 gridview 小部件中的列.我通过直接在视图中将列值设置为具有类似功能的功能成功地做到了这一点...
I am trying to split the time stamp into a separate date and time that i can then display as columns in my gridview widget. I successfully did this by setting the column values directly in the view to functions with something like this...
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' =>
[
[
'class' => 'kartikgridDataColumn',
'attribute' => 'videodate',
'value' => function($model)
{
$datetime = new DateTime('start_time');
$date = $datetime->format('Y-m-d');
return $date;
},
],
],
'responsive'=>true,
'hover'=>true
]); ?>
然而,这并不理想,因为我希望能够利用日期和时间作为我的 videoSearch 模型中的属性来进行过滤和排序.
However this is less than ideal as i would like to be able to utilize the date and time as attributes in my videoSearch model for filtering and sorting.
根据我的研究,我已在我的 rules() 和 attributeLabel() 函数中将属性添加到 Video 模型,但是我不确定如何设置该值.我最初的想法是像关系一样做...
From my research i have added the attribute to the Video model in both my rules() and attributeLabel() functions however am unsure of how to set the value. My initial thought was to do it like a relation...
public function getVideodate(){
$datetime = new DateTime('start_time');
$date = $datetime->format('Y-m-d');
return $date;
}
然而,这不会产生预期的结果.我想如果我可以在模型中定义和设置它,然后将它添加到搜索模型应该很简单,因为我的临时解决方案(在视图中)使这显着复杂化.
However this does not yield the desired results. I figured if i can get it defined and set in the model then adding it to the search model should be simple were as my temporary solution (in the view) complicated this significantly.
我打算在他改进的 gridview 小部件上使用 kartik 的日期范围和时间过滤器.先谢谢了,请让我知道我还可以包括什么.
I intend to use kartik's daterange and time filters on his improved gridview widget. Thanks ahead and please let me know what else i can include.
尼克
推荐答案
在你的模型中定义虚拟变量
In your model define virtual variables
class Video extends yiidbActiveRecord {
public $video_date; // defining virtual attribute
public $video_time; // defining virtual attribute
public function rules()
{
return [
// other rules ...
[['video_date', 'video_time'], 'safe'],
];
}
// this method is called after using Video::find()
// you can set values for your virtual attributes here for example
public function afterFind()
{
parent::afterFind();
$datetime = new DateTime('start_time');
$this->video_date = $datetime->format('Y-m-d');
$this->video_time = $datetime->format('H:i:s');
}
// this method is called right before inserting record to DB
// after calling save() on model
public function beforeSave($insert)
{
if (parent::beforeSave($insert)) {
if ($insert) {
// if new record is inserted into db
} else {
// if existing record is updated
// you can use something like this
// to prevent updating certain data
// $this->status = $this->oldAttributes['status'];
}
$this->start_time = $this->video_date . ' '. $this->video_time;
return true;
}
return false;
}
}
在视图中,您然后使用 video_date/video_time 作为属性,您也可能希望将属性标签添加到模型中.
In view you then use video_date / video_time as attribute, also you might want to add attribute labels to model too.
相关文章