laravel 从 sql 表达式中查询有关一对多 table 的构建器表达式
laravel query builder expression about one to many table from the sql expression
a16s
id pic
1 1.jpg
2 2.jpg
3 3.jpg
4 4.jpg
a16s_like
id p_id u_id approve
1 1 2 0
2 1 1 1
3 1 5 1
4 1 6 1
5 1 7 0
6 2 2 0
7 2 3 0
8 2 1 1
9 4 4 0
10 4 3 1
11 4 2 1
SELECT
A.id,
A.PIC,
SUM(CASE WHEN B.approve IS NULL THEN 0 ELSE 1 END) AS Ashowcunt,
SUM(CASE WHEN B.approve=0 THEN 1 ELSE 0 END) AS Nshow,
SUM(CASE WHEN B.approve=1 THEN 1 ELSE 0 END) AS Yshow,
B.approve,
SUM(CASE WHEN B.approve=1 AND B.u_id=3 THEN 1 when B.approve=0 AND B.u_id=3 then 0 ELSE null END) AS U_id3show
FROM a16s AS A
LEFT JOIN a16s_like AS B ON A.ID = B.p_id
GROUP BY A.id,A.pic
获取列表并在 mysql 5.7
上正常工作
当 u_id=2 执行 select 时,我得到
id pic Ashowocunt approve_0_count approve_1_count u_id2_approve
1 1.jpg 5 2 3 0
2 2.jpg 3 2 1 0
3 3.jpg 0 0 0 null
4. 4.jpg 3 0 3 0
u_id=3
id pic Ashowocunt approve_0_count approve_1_count u_id3_approve
1 1.jpg 0 0 0 null
2 2.jpg 0 1 0 0
3 3.jpg 0 0 0 null
4. 4.jpg 1 0 1 1
当我将 sql 更改为 laravel
$search_alls=
DB::select('A.id','A.route','B.approve')
->addSelect(DB::raw('SUM(CASE WHEN B.approve IS NULL THEN 0 ELSE 1 END) as Ashowcount'))
->addSelect(DB::raw('SUM(CASE WHEN B.approve = 0 THEN 1 ELSE 0 END) as Nshow'))
->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 THEN 1 ELSE 0 END) as Yshow'))
->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 AND b.u_id = 2 then 1
when B.approve = 0 AND b.u_id = 2 then 0 ELSE null END) as U_idshow'))
->from('a16s as A')
->join('a16s_like as B', function($join) {
$join->on('A.ID', '=', 'B.p_id');
})
->groupBy('A.id')
->orderby('A.id', 'DESC')
->paginate(12);
return View('comefo.results')
->with('search_alls', $search_alls)
->with('table',$table);
我收到错误
Symfony\Component\Debug\Exception\FatalThrowableError (E_RECOVERABLE_ERROR)
类型错误:传递给 Illuminate\Database\Connection::prepareBindings() 的参数 1 必须是数组类型,给定的字符串,在 D:\AppServ\www\product\vendor\laravel\framework\src\ 中调用Illuminate\Database\Connection.php 第 665 行
您必须明确创建查询:
DB::query()->select(...
您将 table 名称放在了错误的位置。使用table
方法。
echo DB::table('a16s as A')
->select('A.id','A.route','B.approve')
...
->orderby('A.id', 'DESC')->toSql();
显示正常 sql 喜欢
select A
.id
, A
.route
, B
.approve
, SUM(CASE WHEN B.approve
IS NULL THEN 0 ELSE 1 END) as Ashowcount, SUM(CASE WHEN B.approve = 0
THEN 1 ELSE 0 END) as Nshow, SUM(CASE WHEN B.approve = 1 THEN 1 ELSE 0
END) as Yshow, SUM(CASE WHEN B.approve = 1 AND b.u_id = 2 then 1 when
B.approve = 0 AND b.u_id = 2 then 0 ELSE null END) as U_idshow from
a16s
as A
inner join a16s_like
as B
on A
.ID
= B
.p_id
group by A
.id
order by A
.id
desc
a16s
id pic
1 1.jpg
2 2.jpg
3 3.jpg
4 4.jpg
a16s_like
id p_id u_id approve
1 1 2 0
2 1 1 1
3 1 5 1
4 1 6 1
5 1 7 0
6 2 2 0
7 2 3 0
8 2 1 1
9 4 4 0
10 4 3 1
11 4 2 1
SELECT
A.id,
A.PIC,
SUM(CASE WHEN B.approve IS NULL THEN 0 ELSE 1 END) AS Ashowcunt,
SUM(CASE WHEN B.approve=0 THEN 1 ELSE 0 END) AS Nshow,
SUM(CASE WHEN B.approve=1 THEN 1 ELSE 0 END) AS Yshow,
B.approve,
SUM(CASE WHEN B.approve=1 AND B.u_id=3 THEN 1 when B.approve=0 AND B.u_id=3 then 0 ELSE null END) AS U_id3show
FROM a16s AS A
LEFT JOIN a16s_like AS B ON A.ID = B.p_id
GROUP BY A.id,A.pic
获取列表并在 mysql 5.7
上正常工作当 u_id=2 执行 select 时,我得到
id pic Ashowocunt approve_0_count approve_1_count u_id2_approve
1 1.jpg 5 2 3 0
2 2.jpg 3 2 1 0
3 3.jpg 0 0 0 null
4. 4.jpg 3 0 3 0
u_id=3
id pic Ashowocunt approve_0_count approve_1_count u_id3_approve
1 1.jpg 0 0 0 null
2 2.jpg 0 1 0 0
3 3.jpg 0 0 0 null
4. 4.jpg 1 0 1 1
当我将 sql 更改为 laravel
$search_alls=
DB::select('A.id','A.route','B.approve')
->addSelect(DB::raw('SUM(CASE WHEN B.approve IS NULL THEN 0 ELSE 1 END) as Ashowcount'))
->addSelect(DB::raw('SUM(CASE WHEN B.approve = 0 THEN 1 ELSE 0 END) as Nshow'))
->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 THEN 1 ELSE 0 END) as Yshow'))
->addSelect(DB::raw('SUM(CASE WHEN B.approve = 1 AND b.u_id = 2 then 1
when B.approve = 0 AND b.u_id = 2 then 0 ELSE null END) as U_idshow'))
->from('a16s as A')
->join('a16s_like as B', function($join) {
$join->on('A.ID', '=', 'B.p_id');
})
->groupBy('A.id')
->orderby('A.id', 'DESC')
->paginate(12);
return View('comefo.results')
->with('search_alls', $search_alls)
->with('table',$table);
我收到错误
Symfony\Component\Debug\Exception\FatalThrowableError (E_RECOVERABLE_ERROR) 类型错误:传递给 Illuminate\Database\Connection::prepareBindings() 的参数 1 必须是数组类型,给定的字符串,在 D:\AppServ\www\product\vendor\laravel\framework\src\ 中调用Illuminate\Database\Connection.php 第 665 行
您必须明确创建查询:
DB::query()->select(...
您将 table 名称放在了错误的位置。使用table
方法。
echo DB::table('a16s as A')
->select('A.id','A.route','B.approve')
...
->orderby('A.id', 'DESC')->toSql();
显示正常 sql 喜欢
select
A
.id
,A
.route
,B
.approve
, SUM(CASE WHEN B.approve IS NULL THEN 0 ELSE 1 END) as Ashowcount, SUM(CASE WHEN B.approve = 0 THEN 1 ELSE 0 END) as Nshow, SUM(CASE WHEN B.approve = 1 THEN 1 ELSE 0 END) as Yshow, SUM(CASE WHEN B.approve = 1 AND b.u_id = 2 then 1 when B.approve = 0 AND b.u_id = 2 then 0 ELSE null END) as U_idshow froma16s
asA
inner joina16s_like
asB
onA
.ID
=B
.p_id
group byA
.id
order byA
.id
desc