Yii2 在链关系的最后一个添加条件
Yii2 add condition in the last one of chain relations
现在我有:
$products = Product::findAll([1,2,3,4]);
foreach ($products as $product){
$text = $product->part->type->texts;
}
此 returns 来自 Texts
table 的相关记录。
但我只需要从中获得 1 条记录,为此我需要在最后一个连接中再添加一个条件 type->texts
,这在模型中没有定义。它是动态会话变量。
有什么办法吗?
如果您想修改最后一个关系查询以具有附加条件和 return 一个记录而不是多个记录,只需像这样更改最后一个关系调用:
$text = $product->part->type->getTexts()->andWhere(...)->one();
直接关系方法调用 returns yii\db\ActiveQuery
实例,因此您可以根据需要修改条件。
如果您想在不止一个地方使用修改后的关系,请为此创建单独的方法:
/**
* @return yii\db\ActiveQuery
*/
public function getDynamicText()
{
// Insert link from texts relation similar as in hasMany() and additional condition in andWhere()
return $this->hasOne(...)->andWhere(...);
}
然后使用它:
$text = $product->part->type->dynamicText;
在这种情况下,scopes 将是一个方便的解决方案,特别是如果您要使用复杂的条件。
1. 首先创建一个扩展 ActiveQuery
的模型,该模型将用于向您的查询添加条件,例如 active = 1
:
namespace app\models;
use yii\db\ActiveQuery;
class TextQuery extends ActiveQuery
{
public function active($state = 1)
{
$this->andWhere(['active' => $state]); // or any other condition
return $this;
}
}
2. 覆盖 Text
模型中的 find()
方法:
public static function find()
{
return new \app\models\TextQuery(get_called_class());
}
3. 在您的 Type
模型中添加一个方法,通过新创建的范围检索您的关系数据:
public function getActiveText()
{
return $this->hasMany(Text::className(), ['type_id' => 'id'])->active();
}
最后使用如下:
$text = $product->part->type->activeText;
文档对此非常清楚,请检查它们。
现在我有:
$products = Product::findAll([1,2,3,4]);
foreach ($products as $product){
$text = $product->part->type->texts;
}
此 returns 来自 Texts
table 的相关记录。
但我只需要从中获得 1 条记录,为此我需要在最后一个连接中再添加一个条件 type->texts
,这在模型中没有定义。它是动态会话变量。
有什么办法吗?
如果您想修改最后一个关系查询以具有附加条件和 return 一个记录而不是多个记录,只需像这样更改最后一个关系调用:
$text = $product->part->type->getTexts()->andWhere(...)->one();
直接关系方法调用 returns yii\db\ActiveQuery
实例,因此您可以根据需要修改条件。
如果您想在不止一个地方使用修改后的关系,请为此创建单独的方法:
/**
* @return yii\db\ActiveQuery
*/
public function getDynamicText()
{
// Insert link from texts relation similar as in hasMany() and additional condition in andWhere()
return $this->hasOne(...)->andWhere(...);
}
然后使用它:
$text = $product->part->type->dynamicText;
在这种情况下,scopes 将是一个方便的解决方案,特别是如果您要使用复杂的条件。
1. 首先创建一个扩展 ActiveQuery
的模型,该模型将用于向您的查询添加条件,例如 active = 1
:
namespace app\models;
use yii\db\ActiveQuery;
class TextQuery extends ActiveQuery
{
public function active($state = 1)
{
$this->andWhere(['active' => $state]); // or any other condition
return $this;
}
}
2. 覆盖 Text
模型中的 find()
方法:
public static function find()
{
return new \app\models\TextQuery(get_called_class());
}
3. 在您的 Type
模型中添加一个方法,通过新创建的范围检索您的关系数据:
public function getActiveText()
{
return $this->hasMany(Text::className(), ['type_id' => 'id'])->active();
}
最后使用如下:
$text = $product->part->type->activeText;
文档对此非常清楚,请检查它们。