在模型 laravel 的所有选择中显示相关表列

Posted

技术标签:

【中文标题】在模型 laravel 的所有选择中显示相关表列【英文标题】:show related table columns in all select of model laravel 【发布时间】:2017-03-12 16:30:49 【问题描述】:

我想在模型(用户)laravel 的所有选择中显示相关的表列(customers.name)。 我使用访问器 laravel。

用户表:

id    name    customer_id
1     hassan  1

客户表:

id    name
1     customer1

现在使用

$user = Auth::user();
return $user;

我要表演:

id: 1,
name: "hassan",
customer_id: 
    id: 1,
    name: "customer1"

但显示此错误:

调用 App\User::jsonSerialize() 失败

class User extends Authenticatable

    use EntrustUserTrait;

    /**
     * Get the user's customer name.
     *
     * @param  string $value
     * @return array
     */
    public function getCustomerIdAttribute($value)
    
        return [
            'id' => $value,
            'name' => $this->customer->name
        ];
    

    /**
     * The attributes that should be casted to native types.
     *
     * @var array
     */
    protected $casts = [
        'customer_id' => 'array',
    ];

    /**
     * Get the customer record associated with the user.
     */
    public function customer()
    
        return $this->belongsTo(Customer::class);
    

【问题讨论】:

解释清楚。你想得到什么? 编辑答案,请再次显示。谢谢。 如果你有好的解决方案(除了访问器 laravel ),请解释一下。 【参考方案1】:

因此,您希望根据 users 中的 customer_id 从 users 表中获取客户名称。

在 User.php 模型中

public function customer()
    return $this->hasOne(Customer::class,'id','customer_id');

那么,

$user = Auth::user();
$user->customer;

【讨论】:

我想使用 ::all()。【参考方案2】:

似乎这是一个已知问题 (https://github.com/FrozenNode/Laravel-Administrator/issues/879)。

我建议,在获得 ::all() 结果后,循环遍历它并调用 $user->customer。

foreach($result as $user) $user->customer;

【讨论】:

我以前使用过这段代码,但我想找到一个好的解决方案。谢谢。【参考方案3】:

您应该删除 $casts 属性。整数无法直接从数据库中转换为数组,因为从数据库中选择属性时会立即使用 casts 属性。

此外,不需要 getCustomerIdAttribute 方法,因为客户将自动转换为名为“客户”的虚拟属性。

简而言之:只需定义客户关系就足够了。它应该返回请求的输出,除了它被称为“customer”而不是“customer_id”。

【讨论】:

【参考方案4】:

我找到答案了。

public function getCustomerNameAttribute()

    return $this->attributes['customer_name'] = ($this->customer ? $this->customer->name : null);


/**
 * The accessors to append to the model's array form.
 *
 * @var array
 */
protected $appends = [
    'customer_name',
];

【讨论】:

以上是关于在模型 laravel 的所有选择中显示相关表列的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.5如何获得与模型相关的所有模型?

laravel 5 - 获取相关模型值

如何获取 Laravel 中所有模型的列表?

在 Laravel 中如何通过 Model 知道表列是不是为外键?

如何在 Laravel 4 中选择相关模型计数为 0 的模型?

如何在多对多关系 Laravel 中检索所有相关模型?