![](/img/trans.png)
[英]How to bind parameters to a raw DB query in Laravel that's used on a model?
[英]In Laravel, how do you bind parameters to a query in query builder DB raw inside another query?
我正在构建两个查询:
$color = \DB::table('colors')->take(10)->orderBy('id', 'desc');
if(isset($between)){
$color->whereBetween('id', [$start, $end]);
}
$flavor = \DB::table(\DB::raw('(' . $color->toSql() . ') as color'))
->join('flavor', 'flavor.color_id', '=', 'color.id')
->select('color.id', 'color.name', 'flavor.name');
return $flavor->get();
如果有$between
集,我需要在第一个查询中绑定 2 个值。 它必须在\DB::raw
里面。
我怎么做?
PS如果我单独运行第一个查询,它可以完美运行。 但是当我尝试一次运行整个查询时,我得到了General error 2031
(基本上参数没有绑定)。
您可以尝试在执行之前将第一个查询中的绑定合并到第二个查询中:
$flavor->mergeBindings($color);
或者只是没有绑定“类型”的绑定:
$flavor->addBinding($color->getBindings());
第二个应该可以工作,因为您只有一个where
的绑定,它是addBinding
的默认类型。 对于具有其他绑定的更高级查询,您可能希望 go 合并绑定的方式,因此绑定的“类型”是准确的。
首先,将您的DB::table('color')
更改为您的 Model 名称,例如
Color::take(10)->orderBy('id', 'desc')
其次,添加
->mergeBindings($color->getQuery)
像这样的东西:
use App\Models\Color;
...
$color = Color::take(10)->orderBy('id', 'desc');
if(isset($between)){
$color->whereBetween('id', [$start, $end]);
}
$flavor = \DB::table(\DB::raw('(' . $color->toSql() . ') as color'))
->mergeBindings($color->getQuery())
->join('flavor', 'flavor.color_id', '=', 'color.id')
->select('color.id', 'color.name', 'flavor.name');
return $flavor->get();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.