Laravel 5 变量构造查询字符串 Eloquent

Posted

技术标签:

【中文标题】Laravel 5 变量构造查询字符串 Eloquent【英文标题】:Laravel 5 Variable Constructed Query String Eloquent 【发布时间】:2018-06-13 06:54:42 【问题描述】:

我正在尝试将 JSON 发送到我的 Laravel 服务器并返回 Eloquent 查询字符串的结果,该字符串本身是根据正在发送的 JSON 构造的。我计划将多个 where/whereHas 语句链接在一起来实现这一点,但到目前为止,我一直坚持第一个,想知道这是否可能。

代码:

if(isset($settings->new))
$assetQuery = "where('created_at','>',".Carbon::now()->subMonths(1).")";

if(isset($settings->long))
$assetQuery = "where('lengthD','Long')";

if(isset($settings->short))
$assetQuery = "where('lengthD','Short')";

if(!isset($settings->new)&&!isset($settings->long)&&!isset($settings->short))
$assetQuery = "where('id','>',0)";

$batch = MyModel::whereHas('asset',function ($query) use ($assetQuery)return $query->$assetQuery;)
->orderBy('id', 'desc')->take(20)->get();

$settings 是我的 JSON 的 json_decode 表示。它只有一条指令进入$assetQuery。如您所见,如果它没有任何这些指令,它将选择所有指令 (where('id','>',0))。

我的问题是我似乎无法将 $assetQuery 字符串附加到 $batch Eloquent 行。我该怎么做才能将变量查询串在一起?

我确实看到了这个:Laravel Advanced Wheres how to pass variable into function?

但在这种情况下,该变量只用于查询的一小部分,而不是用于整个查询字符串。也许我需要在function ($query) 函数中移动我的条件?

【问题讨论】:

为什么要将查询函数格式化为字符串? @JimWright 我没有意识到我有更好的选择! 【参考方案1】:

我不能 100% 确定您的确切要求,但我认为以下内容对您有用。

$batch = MyModel::whereHas('asset', function ($query) use ($settings)
    if(isset($settings->new))
        $query->where('created_at','>',Carbon::now()->subMonths(1));
    
    if(isset($settings->long))
        $query->where('lengthD','Long');
    
    if(isset($settings->short))
        $query->where('lengthD','Short');
    
    if(!isset($settings->new)&&!isset($settings->long)&&!isset($settings->short))
        $query->where('id','>',0);
    
)->orderBy('id', 'desc')->take(20)->get();

【讨论】:

以上是关于Laravel 5 变量构造查询字符串 Eloquent的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 将变量传递给查询生成器

PHP笔记-laravel框架中的数据库查询构造器

Laravel 的 ORM 返回的数据类型小结

laravel数据库查询返回的数据形式

Laravel 5.1 在 url 中添加查询字符串

Laravel 查询:Php 内爆数组字符串值 [重复]