【问题标题】:Eloquent eager loading multiple tables雄辩的急切加载多个表
【发布时间】:2015-09-20 13:23:31
【问题描述】:

我正在尝试获取属于某个作者的书籍的封面。到现在为止还挺好。但它会为每本书生成一个单独的查询,加载一个页面需要 2 秒,我认为我做错了什么。

我对我的 cmets 表使用预先加载(评论属于一个用户),但由于我对图像表使用多态关系(一个图像可以属于不同类型的其他表,例如用户、事物或组,所以我不能在 images 表中使用外键,因为这不是一个正确的约定),这次我找不到实现相同目标的方法。

图像模型

namespace App\Models;

use Illuminate\Database\Eloquent\Model;


class Image extends Model
{

    public function imageable()
    {
        return $this->morphTo();
    }

}

人物模型(作者)

namespace App\Models;
use Illuminate\Database\Eloquent\Model;

class Person extends Model {
    public function books()
    {
        return $this->belongsToMany('\App\Models\Thing', 'person_thing');
    }

事物模型(书籍)

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Thing extends Model {

    public function cover() {
        return $this->morphMany('\App\Models\Image', 'imageable');
    }
}

控制器

    $findBooks = Person::with(array('books' => function($query)
            {
                $query->groupBy('original_name');
            }))->find(52957);

            $allbooks = $findBooks->books;


return view('frontend.index')->with('allbooks', $allbooks)
        }

当前视图

@foreach($allbooks as $allBooks)
    @foreach($allBooks->cover as $value)
        <img class="hund" src="{{$value->link}}" alt="">
    @endforeach
@endforeach

图片:

【问题讨论】:

  • 我之前没有尝试过使用急切加载约束,但是您可以使用点表示法进行嵌套关系急切加载。所以试试array('books.cover' =&gt; function...。我唯一不确定的是$query-&gt;groupBy(...) 是否指的是每个封面或每本书。
  • 你可以尝试通过返回的 Collection 来延迟加载覆盖关系。 $allbooks = $findBooks-&gt;books-&gt;load('cover'); 我不确定groupBy 是否也会影响这一点,但这是一个想法。

标签: eloquent laravel-5.1


【解决方案1】:

来自this post on Laracasts

$query->with([
    'child' => function ($q) {
        $q->where(’someCol', ’someVal’); //constraint on child
    },'child.grandchild' => function ($q) {
        $q->where(‘someOtherCol’, ‘someOtherVal’); //constraint on grandchild
    }
]);

【讨论】:

    【解决方案2】:

    如果您的页面需要 2 秒来加载,我认为您的问题不在于急切加载或变形,您是否安装了 laravel/debugbar 以准确查看需要 2 秒或运行多少查询?

    【讨论】:

      猜你喜欢
      • 2013-09-22
      • 2019-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-17
      相关资源
      最近更新 更多