2017-06-12 15:43:26 2390次浏览 7条回答 1 悬赏 11 金钱

例如: a表: user表 b表:中间关联表 relation_user c表:用户relation_detail 表 现在需要通过relation_user 中某个字段去关联relation_detail ; 最后能搜出relation_detail 中的name 字段

请问三表关联搜索这个怎么实现? EOZ{BF2@F1D4KT05{GM5IX.png

补充于 2017-06-12 15:44

EOZ{BF2@F1D4KT05{GM5IX.png

亿速云

最佳答案

  • 阿江 发布于 2017-06-12 16:37 举报

    varTable(),要是mongoDB可以使用多个var()

    class Order extends ActiveRecord
    {
        public function getOrderItems()
        {
            return $this->hasMany(OrderItem::className(), ['order_id' => 'id']);
        }
        public function getItems()
        {
            return $this->hasMany(Item::className(), ['id' => 'item_id'])
    			//使用via()
                ->via('orderItems');
        }
    }
    
    4 条回复
    回复于 2017-06-12 16:41 回复

    这个方法我试过,使用viatable 报错的sql 显示没有joinWith上中间的关联表。

    回复于 2017-06-12 16:42 回复

    数据可以查不出,为什么搜索就报错呢

    回复于 2017-06-12 17:00 回复

    你用上面这个两个via的试一下,这个逻辑结构简单一些,这个试成功了你再切到viaTable上,上面的代码我测试通过了的!

    回复于 2017-06-12 17:02 回复

    OrderItem就是一个中间表orderItem的AR模型

  • 回答于 2017-06-12 15:45 举报

    一个表关联多个表就用过,,,,,

    1 条回复
    回复于 2017-06-12 15:46 回复

    查数据没有问题,但是gridview 搜索就不能,sql显示没有关联到中间的表

  • 回答于 2017-06-12 15:53 举报

    model文件:

    class NewsSearch extends News
    {   
      public $nickname;//添加变量
    
    
        /**
         * Creates data provider instance with search query applied
         *
         * @param array $params
         *
         * @return ActiveDataProvider
         */
        public function search($params)
        {
            $query = News::find();
            $query->joinWith(['supplierProfile']);//关联表
           
            $dataProvider = new ActiveDataProvider([
                'query' => $query,
            ]);
    
            $this->load($params);
    
            if (!$this->validate()) {
                return $dataProvider;
            }
    
            $query->andFilterWhere(['like', 'nickname', $this->nickname]);//搜索
    
            return $dataProvider;
        }
    }
    

    index.php文件

    [
        'attribute' => 'nickname',
        'label' => '资讯作者',
        'value'=>'supplierProfile.nickname',
        'filter' => Html::activeTextInput($searchModel, 'nickname', [
            'class' => 'form-control'
        ]),
    ],
    
    3 条回复
    回复于 2017-06-12 15:56 回复

    这个你是两个表的搜索,我想要三个表的搜索。

    回复于 2017-06-12 15:57 回复

    那就没用过

    回复于 2017-06-12 15:58 回复

    嗯呢,非常感谢。 不知道yii 能不能实现这个功能

  • 回答于 2017-06-12 16:05 举报

    model类添加hasOne或者hasMany
    modelSearch类添加joinWith做关联查询

    1 条回复
    回复于 2017-06-12 17:28 回复

    上代码,老哥

    觉得很赞
  • 回答于 2017-06-12 16:22 举报

    实现searchModel,gredview照样使用。
    比如搜索relation_user中username单独查就行了:

    $user=relation_user::find()->where(['username'=>'xxxx'])->one();
    $query->andFilterWhere([
        'relation_detail.user_id'=>$user->id
    ]);
    
  • 回答于 2017-06-21 09:28 举报

    //控制器代码
    $infos = DbType::find()->joinWith('goods')->where(['type_id'=>1])->asArray()->one();

    //model代码
    public function getGoods(){

        //一个type表中的id 在goods表中有多个数据,所以用hasmany
        return $this->hasMany(DbGoods::className(),['goods_id'=>'repair_goods_id'])
            ->viaTable('repair_goods',['repair_goods_type'=>'type_id']);
    }
    

    如果对应你那三个表的写法就是

    public function getXXXXX(){

        return $this->hasMany(DbRelationDetail::className(),['user_name'=>'user_name'])
            ->viaTable('relation_user',['id'=>'user_id']);
    }
    
    觉得很赞
  • 回答于 2018-08-24 09:21 举报

    用left join 不能实现吗?

    ( new \yii\db\Query() )

    ->select("{{%relation_detail}}.name")
    ->from("{{%user}}")
    ->leftJoin("{{%relation_user}}", "{{%user}}.user_id = {{%relation_user}}.id")
    ->leftJoin("{{%relation_detail}}", "{{%relation_user}}.user_name = {{%relation_detail}}.user_name")
    ->all();
    
您需要登录后才可以回答。登录 | 立即注册
daisy888
助理

daisy888

注册时间:2017-04-16
最后登录:2018-03-14
在线时长:12小时2分
  • 粉丝0
  • 金钱60
  • 威望0
  • 积分180

热门问题