我在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