Вызов функции undefined в запросе отношений Laravel

Поскольку у меня будет много поисковых фильтров, я создаю их так, как показано ниже. Я показал один фильтр (для сообщений), поскольку он выдает ошибку.

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

public function posts()
{
    return $this->morphToMany('App\Post', 'postable');
}

Пользовательский контроллер

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\User;

class UserController extends Controller
{

    public function searchPage(Request $request, User $user)
    {

        $user = $user->newQuery();

        if ($request->has('post'))
            $user->posts()->where('id', $request->input('post'));

        return $user->get();

    }

}

Получаю: Call to undefined method Illuminate\Database\Eloquent\Builder::posts(), пока думал, что так и надо делать по документация.

Если вы уже проходите User $user, вам вообще не нужно проходить $user = $user->newQuery(); $user->posts()->where(...); должен нормально работать сам по себе.

Tim Lewis 04.01.2019 16:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
1
346
1

Ответы 1

newQuery() вернет экземпляр построителя запросов. Вы не можете связывать отношения на этом.

public function searchPage(Request $request, User $user)
{
    // newQuery returns an instance of Query Builder
    // You can't chain relationships on the Query Builder
    $user = $user->newQuery();

    // You want an instance of the User model here. 
    // This is just an example
    $user = \App\User::find($request->id); 

    // If you are already passing in the user model
    // you can just use it as it is. No need to do 

    if ($request->has('post')) {
        $user->posts()->where('id', $request->input('post'));
    }

    return $user->get();
}

Думаю, я здесь запутался. Из документации: «Поскольку модели Eloquent являются построителями запросов, вам следует просмотреть все методы, доступные в построителе запросов. Вы можете использовать любой из этих методов в своих запросах Eloquent». Могу ли я выполнить $user = \App\User::all();, а затем применить к нему условные предложения where, например $user->where('status', 'active')?

eskimo 04.01.2019 19:53

Да, но определения отношений есть в ваших моделях.

Mozammil 04.01.2019 20:03

Если я начну с $users = User::where('status', 'active') (это красноречиво, верно?) Вместо newQuery(), а затем сделаю $user->posts()->where и т. д., Это не сработает.

eskimo 04.01.2019 20:24
User::where('status', 'active') вернет экземпляр Query Builder, который не будет работать. User::where('status', 'active')->first(); будет работать, поскольку это будет экземпляр App\User. Надеюсь, вы уловили мою мысль :)
Mozammil 04.01.2019 20:32

Хорошо спасибо. Теперь я понимаю, что мне нужно убедиться, что я получаю экземпляр Eloquent. Поскольку я хочу начать со всех пользователей, а затем применить фильтры where позже, как мне это сделать? Я пробовал $users = User::all() (согласно документации), а затем применил $users->posts(), который не работает.

eskimo 04.01.2019 20:42

В итоге я использовал $users = User::query() и запросил связь $users->whereHas('posts', function ($query) use ($post_id) { $query->where('id', $post_id); });

eskimo 04.01.2019 21:17

Другие вопросы по теме