Поскольку у меня будет много поисковых фильтров, я создаю их так, как показано ниже. Я показал один фильтр (для сообщений), поскольку он выдает ошибку.
Модель пользователя
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(), пока думал, что так и надо делать по документация.






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')?
Да, но определения отношений есть в ваших моделях.
Если я начну с $users = User::where('status', 'active') (это красноречиво, верно?) Вместо newQuery(), а затем сделаю $user->posts()->where и т. д., Это не сработает.
User::where('status', 'active') вернет экземпляр Query Builder, который не будет работать. User::where('status', 'active')->first(); будет работать, поскольку это будет экземпляр App\User. Надеюсь, вы уловили мою мысль :)
Хорошо спасибо. Теперь я понимаю, что мне нужно убедиться, что я получаю экземпляр Eloquent. Поскольку я хочу начать со всех пользователей, а затем применить фильтры where позже, как мне это сделать? Я пробовал $users = User::all() (согласно документации), а затем применил $users->posts(), который не работает.
В итоге я использовал $users = User::query() и запросил связь $users->whereHas('posts', function ($query) use ($post_id) { $query->where('id', $post_id); });
Если вы уже проходите
User $user, вам вообще не нужно проходить$user = $user->newQuery();$user->posts()->where(...);должен нормально работать сам по себе.