Почему Laravel не возвращает записи отношений конкретного пользователя (он возвращает записи всех пользователей)? - PullRequest
1 голос
/ 10 марта 2019

Это очень странная ситуация.Я не знаю, есть ли какая-то проблема с моим пониманием или ошибка в Laravel Eloquent ORM.Но вот что происходит.

У меня одна таблица называется users, а другая - user_metas.Одна таблица, очевидно, содержит все пользовательские данные, а другая таблица (user_metas) имеет 4 столбца следующим образом:

  • id
  • user_id
  • имя
  • значение

Теперь в этой таблице есть 4 записи, которые я хочу получить ДЛЯ КОНКРЕТНОГО ПОЛЬЗОВАТЕЛЯ .Они следующие:

  • name => region_name
  • name => region_code
  • name => country_name
  • name => country_code

У меня есть отношения hasMany и belongsTo, определенные в User.php и UserMeta.php соответственно.И вот как я пытаюсь получить указанные выше строки из таблицы user_metas.

$user->meta()->where('name','like','region%')->orWhere('name','like','country%')->pluck('value','name');

Проблема в том, что он возвращает все записи, которые соответствуют region% и country% изцелую чертову таблицу, хотя я запрашивал данные только для конкретного пользователя!Он должен автоматически отфильтровывать другие записи!

Я не знаю, что не так.Может быть, я неправильно понял функцию или что-то не так с Eloquent ORM.Кто-нибудь может распространить здесь некоторые знания?

Обновление: с использованием функции toSql, я понял, что она использует условия напрямую, а не группирует их.Это означает, что это условие user_id = ? AND name = ? OR name = ? вместо user_id = ? AND (name = ? or name = ?).

1 Ответ

3 голосов
/ 10 марта 2019

Наконец-то я разобрался! Единственное, что мне нужно было сделать, - это передать закрытие функции where и записать условия. Вот мой старый код и новый код, который работает.

Старый код:

$user->meta()->where('name','like','region%')->orWhere('name','like','country%')->pluck('value','name');

Новый код:

$user->meta()->where(function($q){
     $q->where('name','like','country%')
       ->orWhere('name','like','region%');
})->pluck('value','name');

И все сложилось так, как я хотел! У Laravel всегда есть идеальные решения!

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