求yii2 hasmany多字段一对多关联解决办法 [ 2.0 版本 ]
产品主表 SKU 和 子产品表SPU 多帐号关联
public function getSpu(){
return $this->hasMany(Spu::className(),['sku' => 'sku','account' => 'account']);
}
加单个条件是可以的,多个条件不行
public function getSpu(){
return $this->hasMany(Spu::className(),['sku' => 'sku']);
}
解析的IN查询结果
查看到/vendor/yiisoft/yii2/db/ActiveRelationTrait.php这个类是有解析多条件的
private function filterByModels($models)
{
$attributes = array_keys($this->link);
$attributes = $this->prefixKeyColumns($attributes);
$values = [];
if (count($attributes) === 1) {
// single key
$attribute = reset($this->link);
foreach ($models as $model) {
if (($value = $model[$attribute]) !== null) {
if (is_array($value)) {
$values = array_merge($values, $value);
} else {
$values[] = $value;
}
}
}
} else {
// composite keys
foreach ($models as $model) {
$v = [];
foreach ($this->link as $attribute => $link) {
$v[$attribute] = $model[$link];
}
$values[] = $v;
}
echo "<pre>";
var_dump(['in', $attributes, array_unique($values, SORT_REGULAR)]);
exit('111');
}
$this->andWhere(['in', $attributes, array_unique($values, SORT_REGULAR)]);
}
求大神指导
kero 补充于 2017-12-19 11:21
我在产品模型中配置获取子产品的 hasMany时
public function getSpu(){
return $this->hasMany(Spu::className(),['sku.sku' => 'spu.sku','sku.account' => 'spu.account']);
}
我的产品和子产品是 sku,account 同时关联的 怎样去配置with查询 产品列表?
共 4 个回答
-
dingjj2010 回答于 2017-12-19 09:23 举报
首先,框架这么解析是没有错的.
其次,你要的是什么? 什么逻辑, 或者有什么错误?
问题中只看到 "加单个条件是可以的,多个条件不行", 然后??共 1 条回复 -
假设:
$customers = Customer::find()->with([ 'orders' => function ($query) { /**@var yii\db\ActiveQuery $query */ $query->andWhere(['status' => Order::STATUS_ACTIVE]); }, ])->all();
建议看:http://www.yiichina.com/doc/guide/2.0/db-active-record
再建议:多看文档,比在这里问人好多了共 1 条回复 -
$this->hasMany(Spu::className(),['sku.sku' => 'spu.sku'])->where(['sku.account' => 'spu.account']);这样试试
或者
你的sku.account和spu.account是一对多的关系
class Sku extends ActiveRecord{public function getSpu(){ return $this->hasMany(Spu::className(),['sku.sku' => 'spu.sku']); } public function getItems() { return $this->hasMany(Item::className(), ['sku.account' => 'spu.account']) ->via('spu'); }
}
$sku = Sku::findOne(100);
$items = $sku->items;共 2 条回复 -
用andOnCondition()可以满足。
return $this->hasMany(Spu::className(),['sku' => 'sku'])->andOnCondition(['sku.account' => 'spu.account']);
NingerJohn 觉得很赞
kero
注册时间:2017-12-17
最后登录:2023-03-08
在线时长:1小时8分
最后登录:2023-03-08
在线时长:1小时8分
- 粉丝1
- 金钱105
- 威望0
- 积分115