php - 有没有办法将选定的属性组合到返回的 Laravel 模型中的特定属性中?

标签 php sql laravel eloquent eager-loading

在使用 selectaddSelect 子句后,是否可以通过 Eloquent 获取(类似于关系的方式)将某些字段组合成单个属性?

我有 3 个模型,例如模型 ABC。我正在编写一个 RESTFUL API 来检索模型 A 的过滤集合。模型AB具有一对一的关系(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/

相关文章:

PHP/MYSQL while循环问题

php - 如何打印当前设置的所有 session 变量?

PHP Mysql GET 上个月和当月数据

php - Laravel Collective HTML5 属性

laravel - 找不到列 : 1054 Unknown column 'orders.deleted_at' in 'where clause'

laravel - 从laravel 5 中的中间件获取当前路由操作名称

php - 递归php/mysql函数问题

php - 更新上传目录中的照片不起作用

c# - 复杂(多架构) Entity Framework 对象映射,用于办公室管理应用程序的无缝集成(并最终替换)

mysql - 如何在magento中测试sql查询?