在使用 select
或 addSelect
子句后,是否可以通过 Eloquent 获取(类似于关系的方式)将某些字段组合成单个属性?
我有 3 个模型,例如模型 A、B 和 C。我正在编写一个 RESTFUL API 来检索模型 A 的过滤集合。模型A和B具有一对一的关系(A属于B),并且模型< strong>B 和 C 也具有一对一的关系(B 属于 C)。
这是我迄今为止所取得的成就:
$builder->select(A.*);
...
if (array_key_exists('with_C', $options) || array_key_exists('C_name', $options)) {
$builder->join('B', 'A.B_id', '=', 'B.id');
$builder->join('C', 'B.C_id', '=', 'C.id');
if (array_key_exists('C_name', $options)) {
$terms = explode(' ', $options['C_name']);
foreach ($terms as $term) {
$builder->where('C.C_name', 'like', "%$term%");
}
}
if (array_key_exists('with_C', $options) && $options['with_C']) {
$builder->addSelect('C.*');
}
}
它似乎检索到了我想要的所有信息,但是当我在最终 ->get()
之后转储所有数据时,所有 C.*
属性只是转储到 attribute 属性中(有些会覆盖 A.*
属性,例如 ID)。
是否有任何可能的方法可以将 C.* 属性分组为检索模型中的 C 属性 - 类似于 Eloquent 关系的做法?
最佳答案
有时,在类型转换模型时,您可以添加数据库中没有相应列的属性。为此,首先为该值定义一个访问器:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* Get the administrator flag for the user.
*
* @return bool
*/
public function getIsAdminAttribute()
{
return $this->attributes['admin'] == 'yes';
}
}
创建访问器后,将属性名称添加到模型的appends属性中。请注意,属性名称通常以“蛇形命名法”引用,即使访问器是使用“驼峰命名法”定义的:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The accessors to append to the model's array form.
*
* @var array
*/
protected $appends = ['is_admin'];
}
将属性添加到 appends
列表后,它将包含在模型的数组和 JSON 表示形式中。 appends
数组中的属性也将遵循模型上配置的可见和隐藏设置。
您可以相应地操作关系数据。
希望这有帮助。
关于php - 有没有办法将选定的属性组合到返回的 Laravel 模型中的特定属性中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45971003/