Laravel, как получить параметр id в отношении модели? - PullRequest
0 голосов
/ 01 июля 2018

У меня есть запрос на получение сообщений:

public function getMessagesFor($id)
{
   $messages = Message::where(function($q) use ($id) {
        $q->where('from', auth()->id());
        $q->where('to', $id);
    })->orWhere(function($q) use ($id) {
        $q->where('from', $id);
        $q->where('to', auth()->id());
    })->get();
}

и эта логика работает как надо, без ошибок все ок. Теперь я хочу получать сообщения напрямую через модель связи с другим пользователем (не аутентифицированным)

так в пользовательской модели я написал:

public function messages()
{
    return $this->hasMany(Message::class, 'to', 'id')
    ->where('messages.from', auth()->id());
 }

И это в основном дает тот же результат, что и предложение first where в функции getMessages. Это соотношение работает нормально.

Проблема в том, что я не знаю, как кодировать вторую часть предложения where. У меня нет доступа к $id в моей модели, так как мне подойти к этому? Есть идеи, как его кодировать?

редактировать: миграция сообщений:

    Schema::create('messages', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('from')->unsigned();
        $table->integer('to')->unsigned();
        $table->boolean('read')->default(false);
        $table->integer('offer_id')->nullable();
        $table->mediumText('body')->nullable();
        $table->timestamps();
    });

1 Ответ

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

Так что я думаю, что проблема в том, что модель отношения (пользователь) уже настроена на получение сообщения, где пользователь является получателем сообщения (до),

$this->hasMany(Message::class, 'to', 'id')

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

//user is reciever
public function sentMessages() {
    return $this->hasMany(Message::class, 'to', 'id')
    ->where('messages.from', auth()->id()); }

//user is sender
public function recievedMessages() {
    return $this->hasMany(Message::class, 'from', 'id')
    ->where('messages.to', auth()->id()); }

В любом случае, я советую вам пойти с вашим первым подходом.

Ладно, так что добавьте свою последнюю подсказку, чтобы получать сообщения

//get all messages with
$this->sentMessages->merge($this->recievedMessages)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...