使用Laravel急切加载嵌套模型的问题

时间:2014-03-11 00:43:31

标签: php laravel eloquent

任何想法为什么以下代码正常工作,返回带有传感器和测量的设备

public function getLastMinutes($device_id,$sensor_id,$minutes = 10) {
...
        $devices = Auth::user()->devices()->where("device_id",$device_id)->with(array('sensors.measurements' => function($query) use ($minutes,$sensor_id) {
            $date = new DateTime;
            $date->modify(-1*$minutes.' minutes');
            $formatted_date = $date->format('Y-m-d H:i:s');

            $query->where('measurements.created_at','>=',$formatted_date);

        }))->get()->toArray();
        return Response::json($devices);
...

但是当我添加第二个 where(“sensor_id”,$ sensor_id)时,json对象返回的measusaments消失

public function getLastMinutes($device_id,$sensor_id,$minutes = 10) {
...
        $devices = Auth::user()->devices()->where("device_id",$device_id)->with(array('sensors.measurements' => function($query) use ($minutes,$sensor_id) {
            $date = new DateTime;
            $date->modify(-1*$minutes.' minutes');
            $formatted_date = $date->format('Y-m-d H:i:s');

            $query->where("sensor_id",$sensor_id)->where('measurements.created_at','>=',$formatted_date);

        }))->get()->toArray();
        return Response::json($devices);
...

有些东西我不见了?

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

我找出问题所在。通过在对象查询中执行with(array('sensors.measurements ....,您无权访问传感器...这意味着通过执行此操作$query->where("sensor_id",$sensor_id),将在测量表上搜索sensors_id ...这是未校正的。因此,解决方案必须包含'sensors'和另一个包含'sensors.measuraments'的解决方案。

所以从这(错误的)

    public function getLastMinutes($device_id,$sensor_id,$minutes = 10) {
...
        $devices = Auth::user()->devices()->where("device_id",$device_id)->with(array('sensors.measurements' => function($query) use ($minutes,$sensor_id) {
            $date = new DateTime;
            $date->modify(-1*$minutes.' minutes');
            $formatted_date = $date->format('Y-m-d H:i:s');

            $query->where("sensor_id",$sensor_id)->where('measurements.created_at','>=',$formatted_date);

        }))->get()->toArray();
        return Response::json($devices);
...

到这个(正确的)

...
$devices = Auth::user()->devices()->where("device_id",$device_id)
            ->with(array('sensors' => function($query) use ($sensor_id) {
                $query->where('sensors.sensor_id',$sensor_id);
            }))
            ->with(array('sensors.measurements' => function($query) use ($minutes,$sensor_id) {
                $date = new DateTime;
                $date->modify(-1*$minutes.' minutes');
                $formatted_date = $date->format('Y-m-d H:i:s');
                $query->where('measurements.created_at','>=',$formatted_date);
            }))
            ->get()->toArray();
            return Response::json($devices);
...
小提示。 laravel-debugbar是一个很棒的项目,你应该检查一下,但它实际上并没有帮助我,因为我有一个SPA和Laravel正在做一个RESTFUL json服务器,由于某种原因,laravel-debugbar没有启动...但是这段代码实际上很棒(取自Get the query executed in Laravel 3/4

        $queries = DB::getQueryLog();
        $last_query = end($queries);
        return Response::json($last_query);

希望可以帮到你