Laravel получает пользователей из нескольких сообщений - PullRequest
0 голосов
/ 02 июля 2018

У меня offers стол с id х

Messages таблица с колонками offer_id и from

и Users таблица с id 's

Я хочу, чтобы пользователи начали с предложения $this в OfferResource Моя цель - получить пользователей, которые ответили на предложение хотя бы одним сообщением.

Я начал настраивать Offer модель с функциональными сообщениями для получения сообщений

public function messages(){
    return $this -> hasMany('App\Message');
}

, поэтому я могу получать все сообщения (начиная с ресурса предложения):

'users' => $this->messages

Как мне теперь настроить модель сообщений, чтобы получать всех пользователей вместо сообщений?

Я пытался написать в Message модель:

public function fromContact()
{
    return $this->hasOne(User::class, 'id', 'from');
}

и затем:

'users' => $this->messages->fromContact

но у меня есть ошибка: "message": "Property [fromContact] does not exist on this collection instance.",

Как мне исправить свой код, чтобы это работало?

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

В вашей таблице сообщений есть поле from, которое ссылается на модель User, и поле offer_id, которое ссылается на модель Offer, что означает наличие отношений ManyToMany между Offer и User.

Предложение модели

public function users(){
    return $this->belongsToMany(User::class, 'messages', 'offer_id', 'from')->using('App\Message');
}

Сводка сообщений

class Message extends Pivot {
     protected $table = 'messages';
}

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

public function offers(){
    return $this->belongsToMany(Offer::class, 'messages', 'from', 'offer_id')->using('App\Message');
}

OfferResource

public function toArray($request)
{
    $users = $this->users; 

    return [
        'id' => $this->id,
        ... //add your offer fields here
        'users' => $users->toArray(), // here $users is a laravel Collection
        'created_at' => $this->created_at,
        'updated_at' => $this->updated_at,
    ];
}

Доступ с контроллера или маршрута

Route::get('/offer', function () {
    return new OfferResource(Offer::with('users')->find(1)); //eager load users
});
0 голосов
/ 02 июля 2018

Я предполагаю, что поле from в таблице Messages заполнено с использованием идентификатора пользователя. Тогда вы можете установить отношения belongsToMany между моделями Offer и User. Поскольку это на самом деле отношение «многие ко многим» с сводной таблицей messages.

В модели Offer определите

public function users()
{
    return $this->belongsToMany('App\User', 'messages', 'offer_id', 'from');
}

Тогда из OfferResource вы можете загрузить данные offers, например:

$offers = App\Offer::with('users')->get();

Затем обведите $offers так:

foreach ($offers as $offer) {
    dd($offer->users); // one offer will have multiple users as a Collection
}

Аналогично для $offer идентификатора 1 вы можете сделать это

$offer = App\Offer::with('users')->find(1)

Затем, чтобы получить users, который прокомментировал это предложение, просто используйте $offer->users

См. Официальную документацию для определения отношения «многие ко многим».

0 голосов
/ 02 июля 2018

В модели сообщений необходимо указать столбец, относящийся к пользователю:

public function fromContact()
{
    return $this->hasOne(User::class, 'from');
}

И затем после того, как сообщения перебираются через них, пользователь получает следующее:

foreach ($this->messages as $message) {
    $user = $message->fromContact;
    // do somthing with the user :)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...