【问题标题】:Issue with eager loading of neasted models with Laravel使用 Laravel 急切加载嵌套模型的问题
【发布时间】:2014-04-14 09:20:05
【问题描述】:

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

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 对象的测量值会消失

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

我有什么遗漏吗?

感谢您的帮助!

【问题讨论】:

  • $sensor_id 定义在哪里?
  • 我已经更新了代码,所以更清楚了,反正 $sensor_id 定义明确没问题,实际上在这两种情况下都会返回传感器对象
  • @SimonBennett 谢谢你的建议。

标签: php laravel eloquent


【解决方案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);

希望能帮到你

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2019-07-29
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    相关资源
    最近更新 更多