使用雄辩的模型映射加入查询

时间:2015-01-29 18:51:43

标签: laravel laravel-4 eloquent

我正在尝试这样做

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的列。我知道他们是一种使用雄辩的关系映射器来实现这一目标的方法。

2 个答案:

答案 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);
}