【问题标题】:Laravel: Is it good practice to use model relationships within a view?Laravel:在视图中使用模型关系是一种好习惯吗?
【发布时间】:2016-06-25 20:54:18
【问题描述】:

我有一个 Laravel 5 视图,我想知道在视图中使用模型关系是否真的是一件好事,就性能而言。

假设汽车模型与挡风玻璃具有一对一的关系。

<div class="col-lg-4">
    <div class="form-group">
        <label class="col-lg-4 control-label">Windshield Model</label>
        <div class="col-lg-8">
            <p class="form-control-static">{{$car->windshield->model}}</p>
        </div>                        
    </div>                        
</div>                                 
<div class="col-lg-4">
    <div class="form-group">
        <label class="col-lg-4 control-label">Windshield Height</label>
        <div class="col-lg-8">
            <p class="form-control-static">{{$car->windshield->height}}</p>
        </div>                        
    </div>                        
</div>    

我的问题是,每次我执行 $car->windshield->someProperty Eloquent 时都会执行一个查询。这是一件好事吗?我的意思是,性能呢? 如果我想显示汽车挡风玻璃的 n 个属性,Eloquent 会执行 N 个查询,对吧?

【问题讨论】:

    标签: php laravel laravel-5 eloquent


    【解决方案1】:

    您显示的代码正是应有的内容。

    如果您在控制器中使用它,N 查询仍然存在。

    如另一个答案中所述,您必须坚持急切负载以避免N + 1

    https://laravel.com/docs/5.2/eloquent-relationships#eager-loading

    【讨论】:

    • 但是如果在控制器中我使用急切加载执行单个查询会怎样。假设 Car::with(['windshield', 'tires', ..., other properties])。 Eloquent 会将其转换为带有连接的单个查询。但是当在视图中执行 $car->windshield N 次时,这意味着应用程序将执行 n 次该查询,还是我错了?
    • 在预加载之后,$car-&gt;windshield-&gt;height 将由 Eloquent 通过数组和对象操作来解析。数据库不会再被触及。请记住,除了急切加载之外,您还可以缓存它。
    • 让我做对了。第一次在视图中调用 $car->windshield->height 时,其他 $car->windshield->property 不会进入数据库,它们会绕过缓存?对不起,我是 Larevel 的新手
    • 不,这些是单独的陈述。您可以使用 laravel debugbar 查看正在运行的查询。这将解决您对此的大部分好奇心,就像它曾经对我一样。
    • 这对我帮助很大!谢谢
    【解决方案2】:

    我认为这不是一个好主意,因为它是一种反 MVC 模式。另外我不确定在这种情况下缓存是否能正常工作。

    要解决N+1问题,你应该使用Eager loading:

    https://laravel.com/docs/5.1/eloquent-relationships#eager-loading

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-30
      • 1970-01-01
      • 1970-01-01
      • 2015-02-18
      • 2016-03-20
      相关资源
      最近更新 更多