Я создал отношения «многие ко многим» в laravel, где пользователи могут делать объявления о событии.
Проблема в том, что я хочу получить объявление сообщение из базы данных, используя отношение.
Вот мой код:
Миграция базы данных:
Schema::create('announcements', function (Blueprint $table) {
$table->id();
$table->text("message");
$table->foreignId('user_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate();
$table->foreignId('event_id')->constrained()->cascadeOnDelete()->cascadeOnUpdate();
$table->timestamps();
});
Модель события:
public function announcements() {
return $this->belongsToMany(User::class, 'announcements');
}
Модель пользователя:
public function announcements() {
return $this->belongsToMany(Event::class, 'announcements');
}
Контроллер событий:
public function getEventAnnouncements($id) {
$event = Event::find($id);
$ann = [];
$event->announcements->each(function ($a) use ($ann) {
// echo $a;
// $ann += $a->message;
});
return $ann;
}
Что я должен написать в контроллере, чтобы получить содержимое столбца messages
?
Вы можете получить доступ к атрибуту сообщения, используя ключевое слово pivot.
$event->announcements->pivot->message;
Таким образом, вы можете получить к нему доступ. И у меня есть небольшой совет для вас, измените имя вашей сводной таблицы на user_event, чтобы было понятно.
Я нашел решение!
Сначала я должен был добавить точку опоры в Модели.
Модель события:
public function announcements() {
return $this->belongsToMany(User::class, 'announcements')->withPivot('message');
}
Модель пользователя:
public function announcements() {
return $this->belongsToMany(Event::class, 'announcements')->withPivot('message');
}
И, наконец, прокрутите результаты, чтобы получить сообщения.
Контроллер событий:
$ann = [];
foreach ($event->announcements as $a) {
$ann[] = [
"name" => $a->name,
"announcement" => $a->pivot->message,
"created_at" => $a->pivot->created_at,
];
}
Это сработало отлично!
Это дает мне свойство [pivot] не существует в этом экземпляре коллекции. Потому что мне нужно получить один экземпляр в объявлении, а это не так. Я хочу получать все объявления.