thinkphp6的join连表查询
说明
join
要关联的(完整)表名以及别名,支持三种写法:
写法1:[ '完整表名或者子查询'=>'别名' ]
写法2:'完整表名 别名'
写法3:'不带数据表前缀的表名'
condition
关联条件,可以为字符串或数组, 为数组时每一个元素都是一个关联条件。
type
关联类型,可以为: INNER、LEFT、RIGHT、FULL,不区分大小写,默认为INNER。
不同前缀
一般情况下,都是一个数据库中查询的,这样的情况下默认使用的都是相同的表前缀,比如(shop_),所以在使用数据库模型关联查询时往往都是这样写的:
Order::alias('o')
->join('user u', 'o.user_id = u.id')
->select();
在以上代码中,因为是使用模型查询,所以默认都会加上表前缀,两张表的完整表名就是shop_order和shop_user,而关联类型则默认为INNER关联。
但这时如果关联了一张不同前缀的表(比如:pay_record),上述的查询语句显然就行不通了,这时就需要在关联语句处稍作修改,修改后的代码如下:
Order::alias('o')
->join(['pay_record' => 'r'], 'o.pay_id = r.id')
->select();
这样便能使用模型关联不同前缀的表进行查询了。
总结
上述的方式其实也就是把join函数中的join参数由字符串修改为数组;
使用示例
/**获取通知记录列表 */
public function getlist()
{
$params = getParams(['page', 'limit', 'name', 'phone', 'subject']);
$where = [];
if (empty($params['page'])) {
$params['page'] = 1;
}
if (empty($params['limit'])) {
$params['limit'] = 10;
}
if (!empty($params['name'])) {
$where[] = ['u.name', 'like', "%{$params['name']}%"];
}
if (!empty($params['phone'])) {
$where[] = ['u.phone', '=', $params['phone']];
}
if (!empty($params['subject'])) {
$where[] = ['u.subject', '=', $params['subject']];
}
// $count = NotificationrecordModel::count();
// 查询通知表,关联用户表
$notificationList = NotificationrecordModel::alias('n')
->join('user u', 'u.uid = n.uid')
->where($where)
->order('n.notificationTime', 'desc')
->field('n.id,u.name,u.subject,u.phone,n.notificationTime')
->page($params['page'], $params['limit'])
->select();
if ($notificationList) {
// 输出查询结果
// foreach ($notificationList as $notification) {
// echo '用户名:' . $notification->name . '<br>';
// echo '通知时间:' . $notification->notificationTime . '<br>';
// echo '<br>';
// }
return apiReturn(0, '获取成功', $notificationList->toArray());
} else {
return apiReturn(1, '暂无数据');
}
}