【发布时间】: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' => function...。我唯一不确定的是$query->groupBy(...)是否指的是每个封面或每本书。 -
你可以尝试通过返回的 Collection 来延迟加载覆盖关系。
$allbooks = $findBooks->books->load('cover');我不确定groupBy是否也会影响这一点,但这是一个想法。
标签: eloquent laravel-5.1