Я строю небольшой блог, и я хотел бы использовать встроенную загрузку Eloquent, но я хотел бы, чтобы он действовал как явное объединение.
Вот что я пытаюсь сделать, используя соединение, которое работает, но не так, как я хочу.
$posts = Post::join('users', function($join){
$join->on('users.id', '=', 'posts.user_id');
$join->on('users.status', '=', DB::raw('active'));
})
->get();
Моя проблема в том, что я не могу использовать модель пользователя в своем сообщении, например, так:
$ сообщений [0] -> user-> Firstname;
При объединении пользовательские данные напрямую устанавливаются в модели постов, поэтому я должен использовать их следующим образом:
$ сообщений [0] -> ПгвЬЫат;
Дело в том, что я хотел бы использовать свою модель User, потому что в ней есть несколько методов, которые я хотел бы использовать. Один для печати полного имени, один для печати его URL и т. Д.
Что я не могу сделать с нетерпеливой загрузкой, так это запретить загрузку сообщения, когда к нему не подключен пользователь. Когда пользователь, связанный с сообщением, не имеет статуса «активный», я все равно получаю сообщение и значение NULL для пользователя. Но я не хочу почту вообще.
Это возможно?
Я достаточно ясен в своих объяснениях?
Спасибо
Вы слишком усложняете вещи. Eloquent имеет все необходимое:
// first make sure you load only posts of active users
$posts = Post::whereHas('user', function ($q) {
$q->where('status', 'active');
})
// then eager load the users
->with('user')
->get();
И, кстати, это то, как вы делаете, что вы пытались, в вашем соединении (без DB::raw
):
$posts = Post::join('users', function($join){
// on() is for comparing fields
$join->on('users.id', '=', 'posts.user_id');
// while where is for comparing to provided values/strings
// just like simple query where()
$join->where('users.status', '=', 'active');
})
Других решений пока нет …