我有一个 Laravel 应用程序,其中包含一些表单和 CRUD 操作。在应用程序上我有这样的关系:
品牌列(枪支表上)引用品牌表上的 ID。
枪支型号:
public function brand()
{
return $this->belongsTo('Brand', 'brand', 'id');
}
品牌型号:
public function gun()
{
return $this->hasMany('Gun', 'id', 'brand');
}
如果我尝试从 Controller 加载枪支数据,使用 with,就像这样:
$results = Gun::with('brand')->findOrFail($id);
但是,每次我想使用 Form 模型显示枪支数据时,品牌都会显示为 ID,而不是品牌名称。
我尝试为此设置一个访问器,如下所示(枪模型):
public function getBrandAttribute ($id)
{
$attribute = Brand::find($id);
return ($attribute ? $attribute->value : $id);
}
它可以工作,但是当我返回包含数据库中所有枪支的列表时,需要花费很多时间。
如何从模型中设置一个访问器来返回品牌名称,而不必每次都进行查询?
我在访问器上 var_dump $this 并且看到了枪支数据,但看不到品牌表中的数据。
最佳答案
当你急切加载时,你不想调用$gun->brand
来获取品牌名称。已设置为返回 Brand
模型。为了获得枪支品牌的名称,您可以执行以下操作:
$gun->brand->name;
假设您的 brands
表中有一个 name
列。
您还可以通过访问已设置的关系来在访问器中设置它。
public function getBrandAttribute()
{
return $this->brand->name;
}
请注意,尽管 Laravel 已经设置了此访问器,但使用此方法,您将覆盖它。如果可以的话,我建议使用不同的属性,例如... getBrandNameAttribute()
关于php - Laravel 访问器、关系和预加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30847326/