Laravel - не удалось установить соединение между двумя таблицами в базе данных

поэтому я пытаюсь «соединить» две таблицы, используя 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, и я не могу ее обойти... пожалуйста, дайте мне знать, если есть простое решение.

Большое спасибо за ваше время

ошибка связана с тем, как вы настраиваете $notification. Вы можете добавить к этому соответствующий код?

N69S 23.11.2022 01:30

Отношения события и уведомления должны быть обратными: то есть: public function notification() { return $this->hasMany(Event::class); } и наоборот

Ali Raza 23.11.2022 06:53

@N69S готово! это оно?

Guilherme Moreira 23.11.2022 14:46

@AliRaza не сработало...

Guilherme Moreira 23.11.2022 15:12

@GuilhermeMoreira не является определением отношения. Как вы получаете переменную $notification, которую вы используете в своем представлении?

N69S 23.11.2022 16:06

@N69S это в первом html-коде, @each('partials.notification', $sent_notifications, 'notification')

Guilherme Moreira 23.11.2022 16:07

и как вы получаете переменную $sent_notifications? поместите весь соответствующий код в свой вопрос напрямую.

N69S 23.11.2022 16:09

это в NotificationController.php, функция называется list

Guilherme Moreira 23.11.2022 16:18

Ваша проблема может быть исправлена ​​с использованием класса Model вместо класса DB напрямую. ответ ниже

N69S 23.11.2022 16:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
9
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Если у вас есть отношение 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');?

Guilherme Moreira 23.11.2022 14:49

Нет разницы. На самом деле, Event::class оценивается как полное имя класса в пространстве имен (вы можете проверить это с помощью dd(Event::class);). Лично я использую способ Event::class, но самое главное — быть последовательным и использовать его одинаково везде в проекте.

Tpojka 23.11.2022 15:02

о, я вижу, так что с точки зрения функциональности они одинаковы

Guilherme Moreira 23.11.2022 15:11

@GuilhermeMoreira Верно. Пример №. 2.

Tpojka 23.11.2022 17:09
Ответ принят как подходящий

Когда вы используете 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, и вы сможете использовать объявленные отношения, а также любой метод, объявленный в вашем классе модели.

Другие вопросы по теме