我正在尝试这样做
select notifications.id, reservations.number from
notifications
JOIN reservations
ON notifications.reservation_id = reservations.id
WHERE notifications.status = 1
使用eloquent所以我有这个
$await = Notification::with('Reservation')->
select('notifications.id', 'reservations.number')
->where('notifications.status', '=', 1)->get();
return Response::json($awaitLists);
在我的通知模型中
public function Reservation() {
return $this->belongsTO('Reservation');
}
在我的预订模式中
public function notification() {
return $this->hasMany('Notification');
}
因此,当预订具有1对多的关系时,通知属于预订
我的问题是为什么不能尝试我的作品。我一直收到未知列'reservation.number',但我确实在预订表中有一个名为number的列。我知道他们是一种使用雄辩的关系映射器来实现这一目标的方法。
答案 0 :(得分:1)
您看到的错误是因为急切的加载关系实际上并不执行连接。它使用两个单独的查询,然后在运行查询后分配关系字段。
因此,当你执行Notification::with('Reservation')->get()
时,它正在运行两个SQL语句,大约是:
Notification::with('Reservation')->get();
// select * from notifications;
// select * from reservations where id in (?, ?, ...);
如果您有兴趣,可以看到使用dd(DB::getQueryLog())
运行的实际查询。
你如何前进取决于你需要做什么。如果您需要完全复制现有查询,则需要手动执行连接。
$notifications = Notification::select('notifications.id', 'reservations.number')
->join('reservations', 'notifications.reservation_id', '=', 'reservations.id`)
->where('notifications.status', '=', 1)
->get();
foreach($notifications as $notification) {
print_r($notification->number);
}
否则,您可以使用Laravel构建的对象:
$notifications = Notification::with('Reservation')->where('status', '=', 1)->get();
foreach($notifications as $notification) {
print_r($notification->Reservation->number);
}
答案 1 :(得分:1)
这应该这样做:
$notifications = Notification::where('status','=',1)->get();
foreach($notifications as $notification) {
$id = $notification->id;
$num = $notification->reservation->number;
$await = [$id,$num];
var_dump($await);
}