php - Laravel 访问器、关系和预加载

标签 php mysql laravel laravel-4

我有一个 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/

相关文章:

c# - .NET Framework 4.5 - EF 从 MySQL 数据库中排除 "ufloat"列

java - 为什么我的日期条目将日期值减 1?

php - 如何向队列传递参数?

javascript - Virtuemart 2.6.6 加入购物车后返回同一页面

javascript - 使用 php 将数据库中的值设置为 JavaScript

MySQL 触发器 : IF ELSE error

database - 如何从 CodeIgniter 数据库迁移到 Laravel 数据库

php - Laravel 选择行有一列包含输入变量

javascript - HighCharts,Json 格式

php - fatal error : Cannot use object of type mysqli_result