2017-12-18 23:18:10 10729次浏览 4条回答 0 悬赏 10 金钱

产品主表 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查询结果
QQ截图20171217180816.jpg

查看到/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)]);
}

QQ截图20171217181141.jpg

求大神指导

补充于 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查询 产品列表?

  • 回答于 2017-12-19 09:23 举报

    首先,框架这么解析是没有错的.
    其次,你要的是什么? 什么逻辑, 或者有什么错误?
    问题中只看到 "加单个条件是可以的,多个条件不行", 然后??

    1 条回复
    回复于 2017-12-19 11:23 回复

    通过两个字段 sku,account 关联的产品表和子产品表 怎样通过with查询来实现查询产品列表?

  • 回答于 2017-12-19 17:22 举报

    假设:

    $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 条回复
    回复于 2017-12-19 17:49 回复

    感觉答非所问! $this->hasMany(Spu::className(),['sku.sku' => 'spu.sku','sku.account' => 'spu.account']); 我要在模型里配置类似这样的关联 关联条件不是单个字段,是多个字段的

  • 回答于 2017-12-20 11:40 举报

    $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 条回复
    回复于 2017-12-21 15:50 回复

    你这想的是中间表的概念吧,Item::className() ?多了一个模型 我没怎么理解。后面我想了一下 多字段关联应该不是纯粹上的一对多关系吧(这个还不怎么确定,但是底层代码确实单独写了解析多个字段的方法,后面直接是在产品里多加了个唯一序列去关联的)

    回复于 2017-12-25 10:36 回复

    对的,是中间表的概念

  • 回答于 2020-03-24 11:06 举报

    用andOnCondition()可以满足。

        return $this->hasMany(Spu::className(),['sku' => 'sku'])->andOnCondition(['sku.account' => 'spu.account']);
    
    觉得很赞
您需要登录后才可以回答。登录 | 立即注册
kero
助理

kero

注册时间:2017-12-17
最后登录:2023-03-08
在线时长:1小时8分
  • 粉丝1
  • 金钱105
  • 威望0
  • 积分115

热门问题