Yii2 关系基于属性值而不是键



我在db(mysql(中有2个表,在2个表之间没有通过键或ID的经典关系。我定义关系的唯一方法是通过属性值。例如,桌轮和汽车以及某些子仅因尺寸而与某些汽车相匹配。是否可以在数据库级别和/或在 yii2 中定义它,如果是,如何定义?

在关系中,我可以添加一个 onCondition((,但你也必须定义一个属性(???),:

public function getWheels() {
return $this->hasMany(appmodelsWheel::className(), ['???' => '???'])->onCondition(['<', 'wheelsize', $this->wheelsize]);
}

我可以使用一个假属性并将其设置为所有记录,例如 1,但这对我来说似乎有点奇怪。

我在网上找不到任何关于此的内容,或者我只是搜索错误的方式,或者我正在尝试一些完全不好的做法。你能指出我正确的方向吗?

假设您可以将空数组设置为链接,但出于安全原因(我认为(,条件">0 = 1"会自动添加到选择中。

我多次遇到你自己的问题,我能找到的最佳解决方案是显式使用ActiveQuery(类似于hasOne和hasMany发生的情况(:

public function getWheels() {
return new ActiveQuery(appmodelsWheel::className(), [
'where' => 'my condition' // <--- inserte here your condition as string or array
'multiple' => true        // true=hasMany, false=hasOne
// you can also add other configuration params (select, on condition, order by, ...
]);
}

这样,您可以同时获取数组和 ActiveQuery 以添加其他条件:

var_dump($model->wheels);            // array of wheels objects
var_dump($model->getWheels());       // yiidbActiveQuery object
$model->getWheels()->andWhere(...);  // customize active query

我不认为你可以通过关系来实现这一点。 但是有一种方法可以解决限制。

<?php
namespace appmodels;
class Car extend yiidbActiveRecord
{
/**
* @var appmodelsWheel
*/
private $_wheels;
/**
* @return appmodelsWheel[]
*/
public function getWheels()
{
if (!$this->_wheels) {
$this->_wheels = Wheel::find()
->where(['<', 'wheelsize', $this->wheelsize])
//->andWhere()  customize your where here
->all();
}
return $this->_wheels;
}
}

然后,您可以像关系一样访问wheels属性。

<?php
$car = Car::find(1);
$car->wheels;

请注意,这种方式不支持Eager Loading

相关内容

  • 没有找到相关文章

最新更新