是否可以使用with方法使用预先加载但是给它另一个名字?类似的东西:
->with('documents as product', 'documents.documents as categories')
我有一个可以是产品或类别的文档表,热切的加载工作但不是那么友好,只需要通过文档名称而不是实际的文档来检索文档。
答案 0 :(得分:3)
任何Laravel版本目前不支持此功能。最好的选择是复制关系,并根据需要命名。例如:
class Post extends Model
public function documents() {
return $this->hasMany(Document::class);
}
public function products() {
return $this->hasMany(Document::class)
->where('type', 'product'); // Scope the query, if necessary
}
public function categories() {
return $this->hasMany(Document::class)
->where('type', 'category'); // Would a Document really be of type 'category', though? Looks like a code smell.
}
}
$postsWithAllDocs = Post::with('documents')->get();
$postsWithProductsOnly = Post::with('products')->get(); // Only eager load Documents of type 'product'
在旁注中,您提到Document
可以是产品或类别,从逻辑上讲似乎没有多大意义。通过重新考虑数据库的结构和关系,可以部分解决问题。
答案 1 :(得分:0)
急切加载告诉"加载此关系数据",接下来您可以访问subject->关系而无需进一步查询
如果你想重命名关系,也许你应该重新命名模型中的relationshp,而不是在急切的加载中
你也可以通过添加虚拟属性来绕过这个:
function getProductAttribute(){
return $this->document;
}
暂时加载原始文件
导致product属性与document:
相同$subject->product === $subject->document
答案 2 :(得分:0)
我问了自己同样的问题,由于我没有在网上找到满意的答案,所以这就是我所做的。 我有:
$o->load('X');
但是我希望$o
对象具有属性Y
和X
关系的值。由于我已经为Y
定义了$o
关系,所以无法将X
重命名为Y
并完成工作。所以我做到了
$o['Y'] = $o->X();
我知道这不是最好的解决方案,但它适用于我的情况:)
注意:load
and with
produce exactly the same number of sql queries-您需要选择一种更适合您的情况。