Laravel 附加具有相关关系的属性将导致达到最大函数嵌套级别

Posted

技术标签:

【中文标题】Laravel 附加具有相关关系的属性将导致达到最大函数嵌套级别【英文标题】:Laravel append attributes with related relation will cause reach maximum function nesting level 【发布时间】:2021-10-19 01:49:48 【问题描述】:
class Order extends Model 

    protected $appends = ['test'];

    public function orderItems()
    
        return $this->hasMany('App\OrderItem');
    

    public function getTestAttribute()
    
        return $this->orderItems->first()->id;
    


class OrderItem extends Model 

    protected $appends = ['test'];

    public function order()
    
        return $this->belongsTo('App\Order');
    

    public function getTestAttribute()
    
        return $this->order->id;
    


给定具有上述定义的模型,当我调用Order::find(1)->toArray() 时,我会收到以下错误。

Maximum function nesting level of '256' reached, aborting!

我应该如何避免这个问题?好像有递归调用

select * from orders where order.id in (?)
select * from order_items where order_items.order_id in (?)

谢谢!

【问题讨论】:

OrderItem 中返回$this->order_id 而不是$this->order->id Un... @Aless55 您的答案是有效的,但仅适用于此示例代码。实际上我想要得到的是 order_item 表中没有的东西,比如 $this->order->total_charge。 【参考方案1】:

您不能在 OrderItem 中添加订单。现在你叫的是: 订单 -> 第一个 OrderItem -> 订单 -> 第一个 OrderItem -> 然后重复。

如果您在其他地方想要带有 Order 的 OrderItem。就做OrderItem::with('order')

【讨论】:

以上是关于Laravel 附加具有相关关系的属性将导致达到最大函数嵌套级别的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 将枢轴附加到具有多个值的表

groupBy 在 laravel 中具有雄辩的关系

在数据透视表 laravel 中添加与附加值的关系

Fluent NHibernate:如何在关系表上映射具有附加属性的多对多关系?

使用javascript将具有删除操作的表单附加到laravel刀片文件

Laravel - 如何访问相关对象其他关系