【问题标题】:Laravel Accessor or HasManyThrough or something else?Laravel Accessor 或 HasManyThrough 或其他什么?
【发布时间】:2020-01-04 09:48:49
【问题描述】:

我有四个模型:UserProductOrderOrderItem

User 将商品添加到他的购物车时,它会创建一个新的Order,并且该商品会变成一个新的OrderItem

表格:

users
    id - integer
    name - string

products
    id - integer
    name - string

orders
    id - integer
    user_id - integer
    paid - boolean

order_items
    order_id - integer
    product_id - integer
    quantity -integer
    price - double

关系:

`Product` hasMany `OrderItem`
`OrderItem` belongsTo `Order`
`OrderItem` belongsTo `Product`
`Order` hasMany `OrderItem`
`User` hasMany `Order`

我希望能够列出所有Product 以及在每个Users 下购买Product (Order whereNotNull 'paid') 的所有Users。 相反,我想显示他们购买的所有Products 的User

我已经尝试在人际关系方面采取措施。我可以让{{ $product->orderItems }} 工作,但不能让{{ $product->orderItems->orders }} 工作

Laravel 不允许 hasManyThrough 与数据透视表建立关系,这基本上就是 order_items 的本质,所以这行不通。

也许我可以使用带有连接的访问​​器来执行此操作,但我无法完全理解它,因为我无法真正设置关系。

也许是一个自定义的 Eloquent 收藏,所以每次我调用 Product 时它已经拥有所有已付费的 User 并且每次我调用 User 时收藏都已经拥有他所有的 Product

【问题讨论】:

标签: php laravel laravel-5 eloquent


【解决方案1】:

Laravel 不支持直接关系。

我为这样的案例创建了一个包:https://github.com/staudenmeir/eloquent-has-many-deep

class Product extends Model
{
    use \Staudenmeir\EloquentHasManyDeep\HasRelationships;

    public function users()
    {
        return $this->hasManyDeep(
            User::class,
            ['order_items', Order::class],
            [null, null, 'id'],
            [null, null, 'user_id']
        )->whereNotNull('orders.paid');
    }
}

$users = Product::find($id)->users;

【讨论】:

  • 这是一个非常有用的软件包,谢谢。为了将其提升到一个新的水平,我希望能够查看一个产品,不仅可以查看购买它的用户,还可以查看何时购买,这可以在订单表 (orders.updated_at) 中找到。关于如何修改上述内容或为此编写新函数的任何建议?
  • @Jacey 你见过github.com/staudenmeir/…吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-03
  • 2011-08-26
  • 2023-04-02
相关资源
最近更新 更多