【问题标题】:Yii CDbCriteria and Model->findAll, how to add custom column?Yii CDbCriteria 和 Model->findAll,如何添加自定义列?
【发布时间】:2026-01-06 23:25:02
【问题描述】:

我在 Yii 中有一个日历应用程序,我在其中存储每个用户的事件。我想为每个事件动态构建一个标题。

此代码在我的控制器中:

$criteria = new CDbCriteria;
$criteria->select = array('all_day','end','id','start');
$criteria->condition = 'user_id ='.$user->id;
$events = Calendar::model()->findAll($criteria);
foreach($events as $event) {
  $event->title = 'test title';
}
echo CJSON::encode($events);

在我的日历模型中,我添加了一个名为 $title 的新属性:

public $title;

但是当我去回显 JSON 时,标题没有显示出来......

[{"all_day":false,"end":"-948712553","id":"2","start":"-146154706"}]

如何为 JSON 结果集添加标题?

【问题讨论】:

  • 所以你最终想要这样的东西:{"title":"test title","all_day":false,"end":"-948712553","id":"2","start":"-146154706"} ?

标签: php yii


【解决方案1】:

这是因为CJSON::encode 编码了每个模型的属性,而自定义属性 没有添加到模型的属性中。将自定义属性添加到模型中的方式,这不能以直接的方式完成。

虽然从this answer 那里得到了提示,但我确实想出了一个解决方法:

$events = Calendar::model()->findAll($criteria);
$rows=array();// we need this array
foreach($events as $i=>$event) {
    $event->title = 'test title';
    $rows[$i]=$event->attributes;
    $rows[$i]['title']=$event->title;
}

echo CJSON::encode($rows); // echo $rows instead of $events

上面的代码应该可以工作。

【讨论】:

  • 这是在每行的末尾添加title,当然如果您愿意,您可以使用更多代码将其添加到每行的开头。
【解决方案2】:

你可以像这样扩展你的模型并提供你的新属性:

    public function getTitle() {
        return "test title";
    }

    public function getAttributes($names = true) {
        $attrs = parent::getAttributes($names);
        $attrs['title'] = $this->getTitle();

        return $attrs;
    }

【讨论】:

  • 这应该是答案!谢谢!
  • 但这不会永久将该属性设置为“测试标题”吗?如何将属性设置为其他内容?
  • 创建setTitle($title)等setter函数。
最近更新 更多