Laravel -无法在数据库中的两个表之间建立连接

mlnl4t2r  于 2022-11-26  发布在  其他
关注(0)|答案(2)|浏览(131)

所以我尝试使用belongsTohasMany“连接”两个表,但似乎不起作用...我将在下面链接我的代码,如果您需要了解其他任何问题,请随时询问!

页面.通知

<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>

查询语句

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

通知控制器.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,我似乎无法绕过它...请让我知道,如果有一个简单的修复。
非常感谢您抽出时间

zwghvu4y

zwghvu4y1#

当你使用DB::table()时,你会得到StdClass的示例作为结果(或StdClass的数组),所以你不能使用在你的模型Notification类中声明的方法。
需要从模型开始查询

$sent_notifications = Notification::where('sent_users_id', $id)->orderBy('id')->get();
$received_notifications = Notification::where('receiver_users_id', $id)->orderBy('id')->get();

这将为您提供一个Notification::类示例的集合,您可以使用声明的关系以及模型类中声明的任何方法。

hfyxw5xn

hfyxw5xn2#

始终使用最佳代码实践,始终使用对您有帮助的代码,而不是会造成障碍的代码。
如果你有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);
    }
}

删除那些重复的方法。我在这里写的是被认为是好的实践。更多好的建议,你也可以找到here

相关问题