поэтому я пытаюсь «соединить» две таблицы, используя belongsTo
и hasMany
, но, похоже, это не работает... Я приведу свой код ниже, если есть что-то еще, что вам может понадобиться, чтобы полностью понять проблему, Пожалуйста, не стесняйтесь спрашивать!
страницы.уведомление
<section class = "all-notifications">
@each('partials.notification', $sent_notifications, 'notification')
@each('partials.notification', $received_notifications, 'notification')
</section>
частичное уведомление
<div class = "singular-notification">
<div class = "notification-title">
<a href = "/event/{{ $notification->event->id }}">
{{ $notification->event->name }}
</a>
</div>
</div>
SQL
CREATE TABLE event (
id SERIAL PRIMARY KEY,
owner_id INT NOT NULL REFERENCES users(id),
name TEXT NOT NULL,
description TEXT NOT NULL,
tag TEXT,
start_datetime TIMESTAMP NOT NULL CHECK (start_datetime >= now()),
end_datetime TIMESTAMP NOT NULL CHECK (end_datetime > start_datetime),
price FLOAT DEFAULT 0.0,
max_capacity INT DEFAULT NULL,
attendee_counter INT DEFAULT 0 CHECK (attendee_counter <= max_capacity AND attendee_counter >= 0),
location TEXT NOT NULL,
image TEXT NOT NULL,
is_private BOOLEAN DEFAULT false,
is_full BOOLEAN DEFAULT false
);
CREATE TABLE notification (
id SERIAL PRIMARY KEY,
event_id INT NOT NULL REFERENCES event(id),
sent_users_id INT NOT NULL REFERENCES users(id) CHECK (sent_users_id != receiver_users_id),
receiver_users_id INT NOT NULL REFERENCES users(id),
status notification_status NOT NULL
);
NotificationController.php
public function list($id)
{
if (!Auth::check()) return redirect('/login');
$sent_notifications = DB::table('notification')->where('sent_users_id', $id)->orderBy('id')->get();
$received_notifications = DB::table('notification')->where('receiver_users_id', $id)->orderBy('id')->get();
return view('pages.notifications', ['sent_notifications' => $sent_notifications, 'received_notifications' => $received_notifications]);
}
Событие.php
public function notifications() {
return $this->hasMany('App\Models\Notification');
}
public function notification() {
return $this->hasMany(Notification::class);
}
Уведомление.php
public function event() {
return $this->belongsTo('App\Models\Event');
}
public function events() {
return $this->belongsTo(Event::class);
}
Ошибка, которую я получаю, это Undefined property: stdClass::$event
, и я не могу ее обойти... пожалуйста, дайте мне знать, если есть простое решение.
Большое спасибо за ваше время
Отношения события и уведомления должны быть обратными: то есть: public function notification() { return $this->hasMany(Event::class); }
и наоборот
@N69S готово! это оно?
@AliRaza не сработало...
@GuilhermeMoreira не является определением отношения. Как вы получаете переменную $notification
, которую вы используете в своем представлении?
@N69S это в первом html-коде, @each('partials.notification', $sent_notifications, 'notification')
и как вы получаете переменную $sent_notifications
? поместите весь соответствующий код в свой вопрос напрямую.
это в NotificationController.php, функция называется list
Ваша проблема может быть исправлена с использованием класса Model вместо класса DB напрямую. ответ ниже
Всегда используйте передовой опыт написания кода и всегда используйте код, который помогает вам, а не код, который является препятствием.
Если у вас есть отношение 1:n, например, $event
имеет много $notifications
, используйте эти единственное и множественное число в именах.
class Event extends Model
{
public function notifications()
{
return $this->hasMany(Notification::class);
}
}
class Notification extends Model
{
public function event()
{
return $this->belongsTo(Event::class);
}
}
Удалите эти повторяющиеся методы. То, что я написал здесь, считается хорошей практикой. Еще больше полезных советов вы также можете найти здесь.
есть ли разница между использованием belongsTo(Event::class);
и belongsTo('App\Models\Event');
?
Нет разницы. На самом деле, Event::class
оценивается как полное имя класса в пространстве имен (вы можете проверить это с помощью dd(Event::class);
). Лично я использую способ Event::class
, но самое главное — быть последовательным и использовать его одинаково везде в проекте.
о, я вижу, так что с точки зрения функциональности они одинаковы
@GuilhermeMoreira Верно. Пример №. 2.
Когда вы используете DB::table()
, вы получаете экземпляры StdClass в качестве результатов (или массив StdClass), поэтому вы не можете использовать методы, объявленные в классе уведомлений вашей модели.
Вам нужно запросить, начиная с модели
$sent_notifications = Notification::where('sent_users_id', $id)->orderBy('id')->get();
$received_notifications = Notification::where('receiver_users_id', $id)->orderBy('id')->get();
Это даст вам коллекцию экземпляров Notification::class, и вы сможете использовать объявленные отношения, а также любой метод, объявленный в вашем классе модели.
ошибка связана с тем, как вы настраиваете
$notification
. Вы можете добавить к этому соответствующий код?