|
本帖最后由 石彦波 于 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();
|
|