Laravel 8,创建一个查询构建器并逐步向其中添加更多查询,如何逐步回滚?

Posted

技术标签:

【中文标题】Laravel 8,创建一个查询构建器并逐步向其中添加更多查询,如何逐步回滚?【英文标题】:Laravel 8, Creating a query builder and adding more queries to it step by step, how can one rollback step by step? 【发布时间】:2022-01-05 15:29:54 【问题描述】:

在 laravel 8 中,我创建了一个简单的查询构建器。

$myRestaurants = Restaurant::where('status', 'active');
$myRestaurants->where('id', '>', 3);
$myRestaurants->where('color', 'red');

结果将是这样的 Illuminate\Database\Eloquent\Builder:

$myRestaurants = Restaurant::where('status', 'active')->where('id', '>', 3)->where('color', 'red');

首先,Laravel 将此查询添加到 $myRestaurants,我不确定这种行为是否正确。顺便说一句,我想回滚到前一步,例如:

$myRestaurants = Restaurant::where('status', 'active')->where('id', '>', 3);

【问题讨论】:

您在哪里/如何自动将这些条件添加到您的查询中? 查询构建器对象具有公共的$bindings$where 属性,因此理论上您可以操作这些属性。如果您不小心,您可能最终会完全破坏您的查询,但最好在实际向查询中添加内容之前防止这种需要 @Rwd 这很奇怪!!我从未保存过查询,只是在对象上调用它们。我不知道我错过了哪里,但是当我添加像:“$myRestaurants->where('foo', 'bar')”这样的行时,它会自动添加并保存到变量 ($myRestaurants) 中的查询生成器。 @apokryfos 啊哈!。现在我知道发生了什么事。但是我怎样才能绕过这个呢? 我想要做的是过滤一些带电的模型。用户取消选择某些条件后,我想返回上一个查询。 【参考方案1】:

你不需要回去试试Restaurant::query()

$myRestaurants = Restaurant::query();
if (true)  // any
    $myRestaurants->where('status', 'active');
else if(false) 
    $myRestaurants->where('id', ">", 3);
else if(true) 
    $myRestaurants->where('color', 'red');


【讨论】:

谢谢。而已。我猜 'Restaurant::query()' 会重置查询生成器,对吧?它有效! @ehsanmohiti 是的,它收集了所有的 sql 语句

以上是关于Laravel 8,创建一个查询构建器并逐步向其中添加更多查询,如何逐步回滚?的主要内容,如果未能解决你的问题,请参考以下文章

如何合并集合和查询构建器,然后在其上使用分页 Laravel 8

覆盖 lombok 构建器并更改值类型

在 Laravel 中构建查询表达式时需要帮助

Laravel 中的消息关系功能

是否有必要在 laravel 中为数据库操作创建模型(用于查询构建器)?

将 MySQL 查询转换为 Laravel 查询构建器代码