Laravel Accessor或HasManyThrough或其他东西?

时间:2019-08-31 13:53:35

标签: php laravel laravel-5 eloquent

我有四个模型: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,并在每个列表下面列出购买了UserProduct)的所有Order whereNotNull 'paid'。 相反,我想展示他们购买的所有User的{​​{1}}。

我尝试着与人际关系逐步发展。我可以让Product工作,但不能{{ $product->orderItems }}

Laravel不允许与数据透视表建立hasManyThrough关系,实际上这是{{ $product->orderItems->orders }}的原因,因此将不起作用。

也许我可以使用带有连接器的访问器来执行此操作,但是由于无法真正设置关系,所以无法解决这个问题。

也许是自定义的雄辩的收藏,所以每次我调用order_items时,它已经拥有所有已付费的Product,每次我调用User时,收藏都已经具有了他所有的{{1} }?

1 个答案:

答案 0 :(得分:2)

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;