【发布时间】:2019-05-07 07:38:32
【问题描述】:
我有 3 张桌子:
clients、traders 和 client_trader_relation
客户可以有很多交易者,交易者可以有很多客户,所以这是一个“数据透视”表的多对多关系。关系在客户端模型中定义如下:
$relations = array(
'traders' => array(self::MANY_MANY, 'traders', 'client_trader_relation(client_id, trader_id)'),
);
现在,当在 CGridView 中显示所有客户的列表时一切正常,但我也希望能够通过特定交易者搜索客户(因此,如果其中一个交易者假设 id 10,则返回此客户)。
我在模型的 search() 函数中是这样做的:
public function search()
{
$criteria=new CDbCriteria;
$criteria->with = 'traders';
$criteria->together = true;
$criteria->compare('traders.id', $this->search_trader);
}
search_trader 是添加到模型和规则中的附加变量,因此可以用于搜索。
虽然这有效,但它成功返回了指定交易者的所有客户,结果不包含任何其他相关交易者,只是我正在搜索的那个。我可以理解这种行为,因为生成的 SQL 就是这样工作的。
我很好奇,是否有任何方法可以从此类搜索中返回所有交易者,而无需进行任何额外的查询/功能?如果不是,那么做这种事情的正确方法是什么?至于现在,我只能想到模型中的一些功能,比如getAllTraders(),它会手动查询与当前客户端相关的所有traders。这会起作用,我可以使用这个函数来显示交易者列表,但它会产生额外的查询和额外的代码。
【问题讨论】: