我有 2 个模型,用户和实体。我需要在我的实体页面上,有分页和一个简单的搜索功能。搜索函数将过滤实体,但它过滤的数据是用户模型中的虚拟字段。
实体模型:
public $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'user_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
};
用户模型中的虚拟字段:
public $virtualFields = array("searchFor" => "CONCAT(User.first_name, ' ',User.last_name, ' ',User.email)");
以及实体控制器中的条件:
$conditions["User.searchFor LIKE"] = "%".str_replace(" ","%",$this->passedArgs["searchFor"])."%";
$this->paginate = array(
'conditions' => $conditions,
'order' => array('Re.created' => 'DESC'),
'limit' => 20
);
从我所读到的内容来看,这是不可能的,因为我不能在关联模型的查询中使用 virtualFields,它说我必须在"运行时"使用它,但我真的不知道如何做到这一点,或者在这种情况下如何做到这一点。有什么想法或方法可以让它工作吗?
您可以尝试将 virtualField 附加到实体模型,如下所示
$this->Entity->virtualFields['searchFor'] = $this->Entity->User->virtualFields['searchFor'];
但是您必须确保完成一个联接,而不是 2 个查询。
我相信书中对此进行了讨论。
编辑:书籍页面
为此,我需要对关联模型中的串联字符串进行搜索。通常,这可以使用 cake 中的 Virtualfields 来完成,但 cake 不支持在搜索中使用关联模型中的 virtualField。
看到 2 个模型已经与 belongsTo 相关联,我只是将条件更改为:
"conditions" => "CONCAT(User.first_name, ' ',User.last_name, ' ',User.email) LIKE" => "%".str_replace(" ","%",$this->passedArgs["searchFor"])."%"
可能不是最优雅的解决方案,但它有效。