gpt4 book ai didi

php - Yii - 使用关系中定义的范围的关系

转载 作者:可可西里 更新时间:2023-10-31 22:45:39 25 4
gpt4 key购买 nike

我有一个模型,其中一些关系定义如下。

public function relations()
{
return array(
'linkingTable' => array(self::HAS_MANY, 'LinkingTable', array('this_id'=>'id'), 'scopes'=>array('valid')),
'linkedItems' => array(self::HAS_MANY, 'LinkedItem', array('linked_item_id'=>'id'), 'through'=>'linkingTable', 'scopes'=>array('valid')),
);
}

链接表和链接项都具有有效范围:

public function scopes() {
return array(
'valid'=>array(
'condition'=>"t.`valid`=1",
),
);
}

为了使生成的连接查询与关系范围一起工作,我必须按如下方式修改范围:

public function scopes() {
return array(
'valid'=>array(
'condition'=>"`linkingTable`.`valid`=1",
),
);
}

和:

public function scopes() {
return array(
'valid'=>array(
'condition'=>"`linkedItems`.`valid`=1",
),
);
}

问题是这些范围在直接从链接模型中使用时将不起作用,即:

$linkedItems = LinkedItem::model()->valid()->findAll();

导致错误表明 linkedItems 不是已定义的别名。当然,这是可以理解的。它还导致需要任何其他想要拥有某些 LinkedItems 的模型需要以完全相同的方式定义关系。

是为每个用例定义不同范围的唯一解决方案,如下所示:

public function scopes() {
return array(
'valid'=>array(
'condition'=>"t.`valid`=1",
),
'validForModelRelation'=>array(
'condition'=>"`linkedItems`.`valid`=1",
)
);
}

这感觉有点笨拙。我想知道是否有更好的方法来做到这一点?

最佳答案

您需要能够获取表的当前别名。 t 单独时为关系名,相关模型时为关系名。在相关模型的范围内,您可以使用:

public function scopes() {
return array(
'valid'=>array(
'condition'=>$this->tableAlias.".`valid`=1",
),
);
}

但是,如果您在 defaultScope 中使用它,则需要使用 $this->getTableAlias(false, false). 作为参数以防止无限循环,试图找到别名。

编辑:缺少点

关于php - Yii - 使用关系中定义的范围的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12315079/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com