【问题标题】:Is there any way to cast a relationship table attribute in laravel?有没有办法在 laravel 中转换关系表属性?
【发布时间】:2020-06-11 10:04:12
【问题描述】:

我有一个带有购物车功能的用户模型,它在加入三个表格后返回所有购物车详细信息。我想将属性转换为 JSON 类型的数组。

示例:我有四个表 userscartsitem_detail_informationsitem_details 表,其中 item_details 表 图片列是 JSON 类型。我想将图片 JSON 数据转换为数组。

我的购物车功能是这样的。

public function carts()
{
    return $this->hasMany('App\Models\Cart')
    ->join('item_detail_informations', 'carts.item_detail_information_id','=','item_detail_informations.id')
    ->join('item_details', 'item_detail_informations.item_detail_id','=','item_details.id')
    ->join('items', 'item_details.item_id','=','items.id')
    ->select('carts.user_id','carts.item_detail_information_id','item_detail_informations.size','item_detail_informations.price','item_detail_informations.item_detail_id', 'item_details.picture','item_details.item_id')
    ;
}

我正在尝试像这样投射图片属性。

protected $casts = [
    'item_details.picture' => 'array',
];

但它不起作用。有没有办法把图片属性转成JSON?

【问题讨论】:

  • 您需要在ItemDetail 模型中强制转换属性,并删除所有连接并通过with eloquent 方法执行。所以return $this->hasMany('App\Models\Cart')->with(['items', 'item_details', 'item_detail_informations'])
  • 与用户表和项目表没有直接关系,所以我得到Call to undefined relationship [items] on model [App\Models\Cart]
  • carts 模型内部,有一个关系方法名itenDetailInformation。所以如果我这样写return $this->hasMany('App\Models\Cart')->with(['itemDetailInformation']) 我可以访问 item_detail_informations 表但我不能访问其他表。
  • 好的,然后添加其他关系。加入你不能改变 eloquent,因为 joinQueryBuilder 一起工作,你需要 EloquentQueryBuilder。所以在这种情况下,添加其他关系,雄辩的会做其他事情。

标签: laravel eloquent casting query-builder eloquent-relationship


【解决方案1】:

删除购物车方法中的所有连接(而不是通过 with 使用预先加载)。并在 ItemDetail 模型中转换属性。当您调用carst 方法时,它会自动拾取。希望对你有帮助

【讨论】:

  • 我在使用 ->with() 关键字时收到此错误Call to undefined relationship [items] on model [App\Models\Cart]
  • 你有购物车模型的物品方法吗? public function items(){ return $this->hasMany(Item::class) }
  • 不,carts 模型有itemDetailInformation 方法,ItemDetailInformation 模型有itemDetail 方法,itemDetail 模型有item 方法
  • 所以你可以把这个关系称为with(itemDetailInformation.itemDetail.item)以点分隔
  • 您可以使用api resources 来映射结果数据。有很多用处
【解决方案2】:

您需要改用eager loading

【讨论】:

    猜你喜欢
    • 2019-06-02
    • 2015-08-01
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多