红枫心声社区

 找回密码
 立即注册

手机动态码快速登录

手机号快速注册登录

搜索
热搜: 活动
查看: 283|回复: 0

Yii2joinWith多条件查询

[复制链接]

50

主题

134

帖子

369

积分

正式会员

Rank: 3Rank: 3

积分
369

活跃会员

发表于 2022-5-9 08:23:36 | 显示全部楼层 |阅读模式
本帖最后由 石彦波 于 2022-5-9 08:25 编辑

比如说我现在有一个需求

1.完成首页展示以及搜索。

需要搜所内容如下



最后分析下来发现有三个表

经纪人表 (这里 比作 a 表)

公司表  (这里比作b表)

经理人开通服务表 (这里比作c表)

如果要实现需要关联经纪人表、公司表、经理人开通服务表

如果拼接原生sql

那么就是 select * from a left join a.company_id = b.company_id 这是 a 跟 b的关联 为了找出经纪人的公司地址

把刚才关联好的当做另一个集合取名为ab

用ab 再次 left join c a.manager_id = c.manager_id;

将上述合成一个:

(select * from a left join a.company_id = b.company_id)as ab left join c a.manager_id = c.manager_id;

这期间会涉及很多字段很多繁琐性的操作

yii2考虑到了这一点

所以衍生出了文章的主题joinWith

聊这个之前我们来分析一下 表 跟 表 之前的关系

首先经纪人表里面是经纪人的信息,没有公司地址的信息,只有公司名称跟公司ID,而另一个公司表里面有公司却有公司的地址

那么就需要进行关联。

经纪人对于公司来讲,他是一对一的关系。(以经纪人为参照物的话,经济人对于公司来讲是个一对一的关系,即一个经纪人在一个公司)

然后经纪人对于经理人开通服务表

一个经纪人可以有多个服务

我可以有问答服务,视频服务,音频服务

所以以经纪人为参照物,经纪人对于经理人开通服务是一对多的关系



如果看懂了,那就可以引出

yii2自带的关联方法

hasOne() 一对一关系

hasMany()一对多关系

我们接下来要做的就是跟拼接sql一样的逻辑 a 关联 b,ab联合后在关联c



上代码:

/**获取客户和公司一对一关系
     * @return \yii\db\ActiveQuery
     */
    public function getCompanyAdress()
    {
//        hasOne('需要关联的model名',['当前model关联id'=>'另一个model需要跟当前model关联的id'])
        return $this->hasOne(Company::className(), ['company_id' => 'company_id']);
    }
/**获取服务一对多关系
* @return \yii\db\ActiveQuery
*/
public function getManagerServices()
{
    //        hasMany('需要关联的model名',['当前model关联id'=>'另一个model需要跟当前model关联的id'])
    return $this->hasMany(ManagerService::className(), ['manager_id' => 'manager_id']);
}
这里预先定义查询关系,具体这个是怎么实现的为什么这么写就可以我还没有研究

下面会用到

$query = self::find()
            //一对一关联公司表        
           //joinWith(['companyAdress 刚才定义好的 getCompanyAdress方法直接写get后面的就可以区分大小写' => 匿名函数调用 function(声明一个model随便写名字) use (条件){ return $model->各种查询方法 }])
            ->joinWith(['companyAdress' => function ($companyAdress) use ($address) {
                //省市区查询
                if ($address['province_id'] != 0) {
                    return $companyAdress->andWhere(['province_id' => $address['province_id']]);//省
                }
                if ($address['city_id'] != 0) {
                    return $companyAdress->andWhere(['city_id' => $address['city_id']]);//市
                }
                if ($address['area_id'] != 0) {
                    return $companyAdress->andWhere(['area_id' => $address['area_id']]);//区
                }
            }])
            //一对多关联服务关系表
            ->joinWith(['managerServices' => function ($managerServices) use ($service_type) {
                return $managerServices->andWhere(['service_type' => $service_type]);
            }]);
最后附上分页查询

$total = clone $query;
$count = $total->distinct('manager_id')->count();
$page = intval($params['page']);
$limit = intval($params['limit']);
//偏移量
$offset = ($page - 1) * $limit;
$data = $query->orderBy(['manager_id' => SORT_DESC])->offset($offset)->limit($limit)->asArray()->all();


您需要登录后才可以回帖 登录 | 立即注册 手机动态码快速登录

本版积分规则

快速回复 返回顶部 返回列表