2015-03-13 84 views
1

如何在Laravel的雄辩中写下以下内容?雄辩的查询替代

SELECT * 
FROM 
    (SELECT real_estate.property_id, 
      real_estate.amount_offered, 
      payee.summa 
    FROM real_estate 
    LEFT JOIN 
    (SELECT property_id, 
      SUM(amount) AS summa 
     FROM payments 
     GROUP BY property_id) payee ON payee.property_id = real_estate.property_id) yoot 
WHERE summa = 0.05 * amount_offered 

已经在这一段时间了,真的无法绕过它。列梅解释了恐慌的全部原因。

我有两个表,一个用于属性,另一个用于对这些属性进行的付款。现在在任何特定时间,我都希望查询哪些属性已付给一定的百分比,因此0.05就代表了5%。因为这是查询的作品,但我需要一个雄辩的替代品。谢谢

+2

你到目前为止尝试过什么吗?发表一些说明你解决这个问题的代码。 – Bogdan 2015-03-13 11:52:56

+0

尝试了几个查询,从DB :: table(DB :: raw($ qry))和其他一些我将很快发布的查询,删除它们,因为我没有得到任何有利的输出@Bogdan – Cozzbie 2015-03-13 13:19:44

回答

2

你在你的SQL中有子查询的地方,你需要使用DB::raw和Eloquent。在这种情况下,你必须为FROM语句子查询大,所以最简单的方法是这样:

DB::table(
    DB::raw('SELECT real_estate.property_id, real_estate.amount_offered, payee.summa FROM real_estate LEFT JOIN (SELECT property_id, SUM(amount) AS summa FROM payments GROUP BY property_id) payee ON payee.property_id = real_estate.property_id)') 
) 
->where('summa', DB::raw('0.05 * amount_offered'))->get(); 

通知我用DB::rawWHERE statment价值为好。这是因为您正在使用列名进行乘法运算,否则该值将被引用为字符串。


如果你想走得更远了一步,用雄辩构建每个子查询,然后将其转换为SQL字符串,并使用DB::raw注入它,你可以这样做:

$joinQuery = DB::table('payments') 
    ->select('property_id', 'SUM(amount) AS summa') 
    ->groupBy('property_id') 
    ->toSql(); 

$tableQuery = DB::table('real_estate') 
    ->select('real_estate.property_id', 'real_estate.amount_offered', 'payee.summa') 
    ->leftJoin(DB::raw('(' . $joinQuery . ')'), function ($join) 
    { 
     $join->on('payee.property_id', '=', 'real_estate.property_id'); 
    }) 
    ->toSql(); 

DB::table(DB::raw('(' . $tableQuery . ')'))->where('summa', DB::raw('0.05 * amount_offered'))->get(); 

在这种情况下, ,第二种方法对第一种方法没有任何好处,除了可能更具可读性。但是,使用Eloquent构建子查询时,如果需要将任何变量值绑定到查询(例如条件),确实具有优势,因为查询将被正确构建并由Eloquent转义,并且您不倾向于SQL注入。

+0

真棒而且非常翔实。谢谢 – Cozzbie 2015-03-13 15:55:36

+0

非常欢迎。 – Bogdan 2015-03-13 16:02:19