有没有办法在 Eloquent 的同一个查询中使用相同的参数到多个位置?

Posted

技术标签:

【中文标题】有没有办法在 Eloquent 的同一个查询中使用相同的参数到多个位置?【英文标题】:Is there a way to use the same parameter into multiple place in the same query with Eloquent? 【发布时间】:2019-03-09 06:46:51 【问题描述】:

我正在开发一个基于 Laravel 5.7 的项目,其中 Eloquent 被用作 ORM。

我需要在我的数据库上执行原始 SQL 语句。但是,我的查询在多个地方使用了相同的参数。

这是一个查询示例“这不是我真正的查询,它更多是为了解释问题。我的实际查询非常复杂,并且多次重复使用相同的参数”

SELECT * FROM table
WHERE a BETWEEN :from AND :to
AND c > :from
AND d < :to

我期待以下工作

$resorces = DB::select('SELECT * FROM table
    WHERE a BETWEEN :from AND :to
    AND c > :from
    AND d < :to', ['from' => '2017-01-01 00:00:00', 'to' => '2018-10-01 00:00:00']);

但这给了我以下错误

SQLSTATE[HY093]: 参数号无效

如何使用 Eloquent 在同一个查询中的多个位置重复使用相同的参数?

【问题讨论】:

【参考方案1】:

在您的模型中创建动态查询范围。

public function scopeQUERY ($query, $value1, $value2)

      $query = DB::(YOUR QUERY);

      return $query;

你的控制器

public function hello(Model name $Modelname)

         $query = $Modelname->QUERY($value1, $value2);


文档https://laravel.com/docs/5.7/eloquent#query-scopes

【讨论】:

【参考方案2】:

这个怎么样?

$from = '2017-01-01 00:00:00';
$to = '2018-10-01 00:00:00';
$resorces = DB::table('table')
    ->whereRaw('a BETWEEN ? AND ?', [$from, $to])
    ->whereRaw('c > ?', [$from])
    ->whereRaw('d < ?', [$to])
    ->get();

【讨论】:

【参考方案3】:

这可能会有所帮助:

https://***.com/a/35968797/10102373

这似乎是一个错误,这个答案提出了几个解决方法。

【讨论】:

【参考方案4】:

这样的东西对你有用吗?

$from = '2017-01-01 00:00:00';
$to = '2018-10-01 00:00:00';
$resorces = DB::select('SELECT * FROM table
    WHERE a BETWEEN ? AND ?
    AND c > ?
    AND d < ?', [$from, $to, $from, $to]);

【讨论】:

我试图避免这样做,因为我有更多的参数 发现这表明它不适用于重复的命名参数:***.com/questions/39257070/…

以上是关于有没有办法在 Eloquent 的同一个查询中使用相同的参数到多个位置?的主要内容,如果未能解决你的问题,请参考以下文章

Eloquent 模型海量更新

Laravel Eloquent,仅选择存在关系的行

查询 eloquent where 子句中的所有值

有没有办法在 Laravel 5.8 中测试 Eloquent Observers?

Laravel - 使用 Eloquent 查询构建器在选择中添加自定义列

根据另一个 eloquent 查询的结果在循环中运行 eloquent 并在刀片中显示列表