你在你的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::raw
为WHERE
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注入。
你到目前为止尝试过什么吗?发表一些说明你解决这个问题的代码。 – Bogdan 2015-03-13 11:52:56
尝试了几个查询,从DB :: table(DB :: raw($ qry))和其他一些我将很快发布的查询,删除它们,因为我没有得到任何有利的输出@Bogdan – Cozzbie 2015-03-13 13:19:44