删除相关的hasManyThrough模型

Pro*_*tas 2 relational-database eloquent laravel-4

我有一些与彼此相关的模型,如下所示:

Order
  - hasMany(CartItem)
  - hasManyThrough(Product, CartItem)

CartItem
  - belongsTo(Order)
  - hasOne(Product)

Product
  - belongsTo(CartItem)
Run Code Online (Sandbox Code Playgroud)

通过调用动态属性和方法表单(例如$order->products,$order->products()对于Order模型),验证所有关系都在工作

现在我想删除与特定订单相关的所有产品,所以我尝试了这个(订单ID = 3):

Order::find(3)->products()->delete()
Run Code Online (Sandbox Code Playgroud)

但这不起作用.由于某种原因,我收到错误消息,指出无法找到加入列:

SQLSTATE[42S22]: Column not found: 1054 Unknown column 'cart_items.order_id' in 'where clause' (SQL: delete from `products` where `cart_items`.`order_id` = 3)  
Run Code Online (Sandbox Code Playgroud)

然而,原始SQL输出(使用toSql())确实包括连接...

谁知道这里有什么问题?

Jar*_*zyk 6

查询生成器删除方法()与其他方法有点不同,因此它会改变查询并且没有连接 - 它只需要'wheres'并省略构建器的其他部分.据说要达到你想要的效果之一:

// This will run delete query for every product
Order::find(3)->products->each(function ($product) {
   $product->delete();
});


// This will run only single query for all of them, which is obviously faster
$productsIds = Order::find(3)->products->modelKeys();
Product::whereIn('id', $productsIds)->delete();
Run Code Online (Sandbox Code Playgroud)

请注意,这两种方法都会从数据库中删除行,但不会从集合中删除模型:

$order = Order::find(3);
// run deletes
$order->products; // Collection still contains all the models!
Run Code Online (Sandbox Code Playgroud)

  • 基本上因为你不想从连接表中删除,至少在MySQL中它是delete()的错误语法. (2认同)