以反向关系有条件地过滤数据透视表 - Laravel 5

时间:2015-08-24 16:16:21

标签: php mysql laravel-5

我有像Venlow一样的roomConfigurations表,

id
roomTypeID
hotelId

然后酒店表就像这样

id
hotelNeme

然后用户表就像这样

id
userId
userName
passwd

然后像这样的hotel_user(Pivot)表

id
user_id
hotel_id

现在我的问题是,如何从roomConfigurations表中获取所选用户的所有记录?

我可以通过连接表格使用MySQL来做到这一点,但我不知道在Laravel 5中这样做。

如果有人能帮助我,我将非常感激。谢谢

2 个答案:

答案 0 :(得分:0)

Laravel docs应该在这里提供帮助。

首先,您需要确保roomConfigurations表格包含idroom_type_idhotel_id而不是hotelId,因为Laravel需要某些命名约定。< / p>

但是,根据你到目前为止所写的内容猜测,我认为它是这样的:

class HotelUser extends Model {
    // so that we can get hotels from a user
    public function hotels () {
        return $this->belongToMany ('App\Hotel');
    }
}

class Hotel extends Model {
    // so that we can get users of a Hotel
    public function users () {
        return $this->belongsToMany ('App\HotelUser');
    }

    public function roomConfigurations () {
        return $this->belongToMany ('App\RoomConfiguration');
    }
}

class RoomConfiguration extends Model {
}

然后使用它可能是这样的:

$userRoomConfigs = HotelUser::find(123)->hotels()->roomConfigurations();

另一种更好的可能性可能是here

class HotelUser extends Model {
    public function roomConfigurations () {
        return $this->hasManyThrough ('App\RoomConfiguration', 'App\Hotel');
    }
}

这样可以这样使用:

$userRoomConfigs = HotelUser::find(123)->roomConfigurations();

为了帮助您的努力,请查看this stack overflow answer,其中介绍了如何显示Laravel正在进行的原始SQL查询。

答案 1 :(得分:0)

我用过这个,它给了我想要的东西 class roomConfigController extends Controller {

public function index()
{
if(Auth::User()->role == 'client') {    
$roomConfigs = roomConfiguration::whereHas('hotels', function($query)
    {
        $query->whereHas('users', function ($query)
        {
        $query->where('users.id', Auth::User()->id);
        });
    })->where('is_delete', '=', '0')->get();
}
else {
    $roomConfigs = roomConfiguration::where('is_delete', '=', '0')->get();
}

//return $roomConfigs;
    return view('roomConfig.index',compact('roomConfigs'));
}