создать предложение whare для атрибута модели - PullRequest
0 голосов
/ 29 сентября 2019

Как создать предложение where для атрибута модели laravel
У меня есть следующее соотношение между user и books.где пользователь hasMany books и модель book принадлежат одному пользователю
Я хочу select all books with pages > 100 that belongs to user_id = 2

Я использую laravel 5.2 с mysql и определил модель для User и другую модель для Book
Когда я хочу получить все книги для конкретного пользователя, я использую

return User::find(2)->books;

, и это прекрасно работает.Но я хочу получить книги, где страницы> 100. Я использую:

return User::find(2)->books->where([['pages', '>', 100], ['chapters', '>', 3]]);

, но не работает

Модель пользователя:

class User extends Authenticatable
{
    public function books()
    {
        return $this->hasMany('App\Book');
    }
}

Модель книги

class Book extends Model
{

  public function user()
  {
    return $this->belongsTo('App\User');
  }
}

Я ожидаю получить все книги с user_id = 0 и страницами> 100 и главами> 3

Ответы [ 2 ]

0 голосов
/ 29 сентября 2019

Чтобы добавить, где находятся супружеские пары на родственных моделях, мы можем использовать функцию whereHas().

Так как вы хотите Книги , Начните с Book модели.

$books = Book::where([
    ['pages', '>', 100],
    ['chapters', '>', 3],
])
->whereHas('user', function($query) {
    $query->where('id', 2);
})
->get();
0 голосов
/ 29 сентября 2019

Вы хотите получить доступ к методу отношения books(), а не к свойству books.Некоторые цитаты из документации:

Запрос отношений

Поскольку все типы отношений Eloquent определены с помощью методов, вы можете вызвать эти методы, чтобы получить экземпляротношения без фактического выполнения запросов отношения.Кроме того, все типы отношений Eloquent также служат построителями запросов, позволяя вам продолжать связывать ограничения на запрос отношений перед окончательным выполнением SQL для вашей базы данных.

Методы отношений Vs.Динамические свойства

Если вам не нужно добавлять дополнительные ограничения в запрос отношения Eloquent, вы можете получить доступ к отношению, как если бы оно было свойством.

Пример решения:

return User::find(2)
    ->books()
    ->where([['pages', '>', 100], ['chapters', '>', 3]])
    ->get();

Обратите внимание, что мы используем books() для доступа к соотношению HasMany и используем для этого метод построителя запросов where(), чтобы создать ограничение.Затем, чтобы завершить и выполнить запрос, мы вызываем get() в конце.Если вы этого не сделаете, вы просто вернете построитель последовательных запросов.

Ваш предыдущий код может не содержать ошибок, поскольку значение, возвращаемое из User::find(2)->books, будет объектом Collection, который на самом деле имеет where() метод.Вероятно, у него не было совпадений из-за формата массива, который вы передали.

...