Красноречивая загрузка, действующая как явное соединение

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

Это возможно?
Я достаточно ясен в своих объяснениях?

Спасибо

0

Решение

Вы слишком усложняете вещи. 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');
})
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]