Laravel Eloquent Query 使用 Where、With、Where 和 orWhere 条件

Posted

技术标签:

【中文标题】Laravel Eloquent Query 使用 Where、With、Where 和 orWhere 条件【英文标题】:Laravel Eloquent Query using Where, With, Where and orWhere condition 【发布时间】:2021-07-12 17:32:15 【问题描述】:

我正在尝试进行 Laravel Eloquent 查询,它将通过订单号和产品名称找到我的订单。 我有 3 个表订单、order_details 和产品。

订单表

id    |   user_id    |    order_id    |    order_cart_id
---------------------------------------------------------
1     |      1       |  123-456-7890  |          1
2     |      1       |  789-456-3210  |          2

order_details 表

id    |   order_id   |    cart_id     |        p_id 
---------------------------------------------------------
1     |      1       |        1       |          22
2     |      1       |        1       |          42
3     |      1       |        1       |          2
4     |      1       |        1       |          32
5     |      1       |        1       |          423
6     |      2       |        2       |          432

产品表

id    |    p_name
--------------------
1     |      ABC       
2     |      CAD       
42    |      PRO       
22    |      XYZ
32    |      IND    
423   |      MP
432   |      ETC

订单模型

public function order_cart_products()

    return $this->hasManyThrough(\App\Models\Products\Product::class,
        \App\Models\Orders\OrderDetail::class,
        'cart_id',
        'id',
        'cart_id','p_id');

订单控制器

$orders = Order::where('user_id', auth()->user()->id)
    ->where('order_id', 'LIKE', '%'.$search.'%')
    ->with('order_cart_products', function ($query) use ($search) 
        $query->orWhere('p_name', 'LIKE', '%'.$search.'%');
    )
    ->get()->toArray();

我要做的是搜索order_id(123-456-7890),如果我通过p_name(ABC) 搜索,我需要获取其中包含产品的所有详细信息。我需要获取所有列出 ABC 的订单。但是我不明白我哪里出错了没有得到想要的输出。

【问题讨论】:

with 不会影响查询本身。它使用辅助查询获取关系并将它们加载到各个模型中,因此如果您稍后尝试使用这些关系,它将使用加载的关系(可以过滤),而不是为该单个模型运行查询。跨度> 【参考方案1】:

试试下面的方法:

$orders = Order::with('order_cart_products')
    ->where('user_id',auth()->user()->id)
    ->where(function ($query) use ($search) 
        $query->where('order_id', 'LIKE', '%'.$search.'%')
            ->orWhereHas('order_cart_products', function ($query) use ($search) 
                $query->where('p_name', 'LIKE', '%'.$search.'%')
            )
    )
    ->get();

【讨论】:

以上是关于Laravel Eloquent Query 使用 Where、With、Where 和 orWhere 条件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Eloquent 在 Laravel 中开始查询?

将 MariaDB 语句转换为 Laravel4 Eloquent-Query

Laravel:使用 Query Builder 或 Eloquent ORM 时在每次插入/更新时执行一些任务

Laravel Eloquent 和 Query Builder “with (nolock)”

Laravel Query:为 Query Builder 实现 Eloquent Scope

Laravel:在“query-builder”或“eloquent”中更改原始查询