laravel mysql表关联以及联合
关联条件如果是多个时,应该尽量都放到on条件下
关联查询一般是,先关联到数据后在根据where条件查询,所以关联的条件很重要,尽可能加上,可以让源数据尽可能地少,减小内存的占用。
laravel 如何实现多条件关联?
关联查询时,如果表名特别长有时候会超出一行不太方便,这里需要使用别名
laravel 如何实现表别名?
mysql查询时,有时候需要多表联合 使用 union,laravel又是如何实现的呢?
mysql查询时,我们想知道最终生成的sql是什么?
这些问题在代码中都已经实现,备份一下留作参考
示例代码
/**
* [testMysql description]
* @return [type] [description]
*/
public function testMysql()
{
$ids = [10,11,12,13,14,15];
DB::connection()->enableQueryLog();
$outer = DB::table('articles as a')
->select('a.id','a.title','a.creator', 'b.name as username')
->join('users as b',function($join) {
$join->on('a.creator', '=', 'b.id')->where('a.id', '<', 10);
})
->where('a.id', '<', 10);
$inner = DB::table('articles as a')
->select('a.id','a.title','a.creator', 'b.name as username')
->join('users as b',function($join) {
$join->on('a.creator', '=', 'b.id')
->where('a.id', '>=', 10)->where('a.id', '<', 20);
})
->where('a.id', '<', 20)->where('a.id', '>=', 10)
->whereIn('a.id', $ids)
->union($outer)->get()->toArray();
$rows = array_map('get_object_vars', $inner);
print_r($rows);
echo '<hr/>';
$userArticles = [];
foreach ($rows as $row) {
if (!isset($userArticles[$row['creator']])) {
$userArticles[$row['creator']] = [$row['id']=>$row['title']];
} else {
$userArticles[$row['creator']][$row['id']] = $row['title'];
}
}
print_r($userArticles);
echo '<hr/>';
print_r($inner);
echo '<hr/>';
$sql = DB::getQueryLog(); //打印当前sql
var_dump($sql);
return;
}