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