SQL Force Left Join соединяется, чтобы печатать без совпадений - PullRequest
0 голосов
/ 19 января 2019

У меня проблема с запросом. У меня есть куча машин, и есть типы машин. Для каждого типа пользователь может выбрать один автомобиль, и я сохраняю это в базе данных. Когда я хочу получить данные, у меня возникают проблемы:

[
  {
    "id_typecar": 1,
    "nom_typecar": "Type17",
    "id_car": 14,
    "id_user": 3,
    "cars": [
      {
        "id_car": 1,
        "nom_car": "775",
        }
      },
      {
        "id_car": 2,
        "nom_car": "048",
      }
    ]
  },
  {
 //Not displayed if user_id != 1 or null -> I want to display that
    "id_typecar": 2,
    "nom_typecar": "Type1",
    "id_car": 13,
    "id_user": 1, //expected output "id_user": null
    "cars": [
      {
        "id_car": 11,
        "nom_car": "123",
      },
      {
        "id_car": 12,
        "nom_car": "456,
      },
      {
        "id_car": 17,
        "nom_car": "789",
      }
]

И мой запрос:

    return TypeCars::with('cars')
        ->leftJoin('cars_user', 'cars_user.id', '=', 'type_cars.id')
        ->where('cars_user.id' = 1)
        ->orWhereNull('cars_user.id')
        ->get()
        ->toJson();

Я хотел получить данные, даже если id_user еще не существует, потому что я должен отображать типы и машины. Я добавил ограничение leftJoin с where "null" or where cars_user.userid = ?, но если пользователь 3 выбрал один тип автомобиля, который не выбрал пользователь 1 (потому что он не будет иметь значение null или userid = 1), он больше не будет отображать автомобили.

Спасибо!

РЕДАКТИРОВАТЬ:

Фактическая выработка:

+---------------------------------+
| id_typecar name_typecar id_user |
+---------------------------------+
| 1 Type1Car 14                   |
| 2 Type2Car 13                   |
| 2 Type2Car 13                   |
| 3 Type3Car NULL                 |
+---------------------------------+

Ожидаемый результат:

+---------------------------------+
| id_typecar name_typecar id_user |
+---------------------------------+
| 1 Type1Car 14                   |
| 1 Type1Car NULL                 | <-- needed for the display
| 2 Type2Car 13                   |
| 2 Type2Car 14                   |
| 3 Type3Car NULL                 |
| 3 Type3Car NULL                 |
+---------------------------------+

Если у меня нет этой строки, если пользователь 13 не указал ни одного автомобиля для этого типа, она не будет отображаться, поскольку пользователь 14 выбрал одну

1 Ответ

0 голосов
/ 19 января 2019

Основываясь на удаленном ответе, я решил свою проблему:

return TypeCars::with('cars')->leftJoin('user_cars', function($join){
    $join->on('user_cars.id', '=', 'type_cars.id');
        $join->on('user_cars.id', '=', DB::raw(1)); 
})
    ->whereNull('user_cars.id')
    ->where('user_cars.id', '=', 1)
    ->get()
    ->toJson();

DB::raw необходимо, чтобы Eloquent не цитировал необработанные значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...