【问题标题】:Laravel query with relationship where have all idsLaravel查询具有所有ID的关系
【发布时间】:2021-09-14 03:09:08
【问题描述】:

我尝试查询一个房间,那里有所有服务

使用我当前的代码,我得到了 room,它至少具有数组中的一个 services,因为我使用的是whereIn

$rooms = Room::select([
    'rooms.id',
    'rooms.available_from',
    'rooms.available_till',
    'rooms.description',
    'rooms.room_type_id',
    'room_types.name as room_types_name',
])
    ->leftJoin('room_types', 'room_types.id', 'rooms.room_type_id')
    ->with('services','reserved_rooms')
    ->when($request->services, function ($query) use ($request) {
        $query->whereHas('services', function ($q) use ($request) {
            $q->whereIn('id', $request->services);
        });
    })
    ->orderByDesc('id')
    ->get();

【问题讨论】:

  • 确切的问题是什么?
  • 我正在寻找替代查询的方法。现在我得到了至少有 1 项服务的房间(条件是 OR),但我需要是 AND。前任。如果我要寻找一个有电视和游泳池的房间,我应该找一个有两种服务的房间,而不仅仅是其中的一种。
  • 我认为您应该对查询采取不同的方法,您可以将表+列添加到您的问题中吗?

标签: laravel eloquent laravel-7


【解决方案1】:

如果要匹配所有服务,可以使用forloop创建AND查询。

试试下面的代码:

->when($request->services, function ($query) use ($request) {
    foreach ($request->services as $key => $service) {
        $query->whereHas('services', function ($q) use ($service) {
            $q->where('id', $service);
        });
    }
})

【讨论】:

  • 当服务为 NULL 或我只选择了 1 个服务时工作正常,但当我选择更多时,查询为空。
  • 当你选择多个时,你在$request->services中的值是多少,是数组还是逗号分隔值
  • 这是一个数组。我也在 whereIn 上使用过它。
  • 你这样做过吗:$q->where('id', $value);
  • 是的,我做到了,但仅适用于 NULL 或 1 服务。
【解决方案2】:
->when($request->services, function ($query) use ($request) {
        $query->whereHas('services', function ($q) use ($request) {
            $q->selectRaw('count(distinct id)')->whereIn('id', $request->services);
        }, '=', count($request->services)
);
    })

更改它,未测试,但这是一般的想法:获取不同 id 的 COUNT 等于数组长度的行。数组应该是唯一的。

【讨论】:

  • 看起来是一样的,但在这种情况下我得到一个错误:完整性约束违规:1052 Column 'id' in where clause is ambiguous (
  • @Beusebiu 只需指定表名“services.id”或您需要的任何表名。
  • 我试过了,我也试过把它包含在select中,但还​​是一样。
  • @Beusebiu 已更改。
  • 我试过这个,现在我得到:SQLSTATE[HY000]: 一般错误:4078 Illegal parameter data types row and int for operation '=' (SQL: select rooms.id, . ..但从这个逻辑我认为不行,因为按照这个逻辑,我只会得到有电视和游泳池的房间,但我需要的是包含那些,而不是只有这两个。
猜你喜欢
  • 1970-01-01
  • 2023-02-13
  • 2018-03-01
  • 2021-11-04
  • 1970-01-01
  • 2021-08-31
  • 1970-01-01
  • 2016-08-04
  • 2015-06-12
相关资源
最近更新 更多