красноречивый laravel - как выбирать пользователей - PullRequest
0 голосов
/ 29 июня 2018

У меня есть две таблицы:

Таблица пользователей с идентификаторами И таблица сообщений с идентификатором пользователя как «от» и идентификатором предложения как offer_id

Я хочу выбрать всех пользователей, которым отправляются сообщения с определенными идентификаторами_предложений

Например Пользователь с идентификатором 1 отправляет несколько сообщений:

Id from   offer_id
1. 1,     5
2. 2,     5
3. 1,     5
4. 1,     3

Я хочу выбрать всех пользователей, которые отправили offer_id = 5, поэтому пользователи с идентификаторами 1 и 2

Как это сделать через eloquent с классом Message и User? Мне предложили offer_id, поэтому я могу легко выбирать сообщения:

$messages = Message::where('offer_id', $id);

а как выбирать пользователей?

редактирование: Я попробовал так: в модели сообщения:

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

и затем в контроллере:

$contacts = $messages->fromContact;

но выдает ошибку

редактировать миграцию:

    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();
    });

и ошибка:

"message": "Undefined property: 
Illuminate\\Database\\Eloquent\\Builder::$fromContact",

1 Ответ

0 голосов
/ 29 июня 2018

Вам не хватает закрытия в вашем построителе запросов. Когда вы используете

$messages = Message::where('offer_id', $id);

У вас нет экземпляра Message до тех пор, пока вы не используете Closure, которые ->first(), ->get() и т. Д. Итак, используя

$message->fromContact;

Приведет к ошибке, сообщающей, что ->fromContact недоступно для экземпляра Builder. Чтобы сделать эту работу, используйте

$messages = Message::where('offer_id', $id)->get();
foreach($messages AS $message){
  $contacts = $message->fromContact;
}

Поскольку это не имеет большого контекста в цикле, приведенный выше код ничего не делает, но $messages->fromContact также будет ошибкой. Чтобы обойти это, используйте:

$message = Message::where('offer_id', $id)->first();
$contacts = $message->fromContact;

Это должно дать вам хорошее представление о том, что происходит не так и как с этим справиться.

Редактировать

При циклическом выполнении нескольких Message экземпляров, нажмите $message->fromContact в массив (или Collection) для использования позже:

$messages = Message::with(['fromContact'])->where('offer_id', $id)->get(); 
// Note: Using `::with()` prevents additional database calls when using `$message->fromContact` in a loop.

$contacts = []; // or $contacts = collect([]);
foreach($messages AS $message){
   $contacts[] = $message->fromContact; // or $contacts->push($message->fromContact);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...