【发布时间】:2016-05-04 22:03:46
【问题描述】:
现在,据我所知,这应该很简单。
我希望能够从数据库中删除多条记录。我有我想删除的所有记录的id。我使用逗号分隔的 id 列表调用 resource.destroy 路由(id 是 postgres 类型 uuid),如下所示:
Request URL:http://foo.app/products/62100dd6-7ecf-4870-aa79-4b132e60c904,c4b369f1-d1ef-4aa2-b4df-b9bc300a4ff5
Request Method:DELETE
另一方面,我的控制器操作如下所示:
public function destroy($id)
{
try {
$ids = explode(",", $id);
$org->products()->find($ids)->delete();
}
catch(...) {
}
}
这给了我以下错误:
BadMethodCallException in Macroable.php line 81:
Method delete does not exist.
in Macroable.php line 81
at Collection->__call('delete', array()) in ProductsController.php line 251
at Collection->delete() in ProductsController.php line 251
at ProductsController->destroy('62100dd6-7ecf-4870-aa79-4b132e60c904,c4b369f1-d1ef-4aa2-b4df-b9bc300a4ff5')
我已验证 find() 正在返回与指定 ID 匹配的 products 集合。
我错过了什么?
PS:
1.模型Product与其他模型有几个belongsTo关系。
2. product.destroy 代码如果我传递一个 id 就可以正常工作
编辑 我想,我也想了解两者之间的区别:
$org->products()->find($ids)->delete()
和
$org->products()->whereIn('id', $ids)->get()->delete()
是吗?据我所知,find 和 get 都在返回 Collections
【问题讨论】:
-
the documentation here 有什么不清楚的地方吗?具体是
destroy()方法? -
我用这个thread 作为参考。我看过你提到的文档。使用产品 ID 调用
Model::destroy时我感到有点紧张,因为恶意用户可能会删除属于其他orgs的产品(orgs有很多products)。我宁愿先找到记录(基于用户所属的organization)然后删除它们。我可以使用 for 循环(n查询)。我还可以使用带有in子句的delete查询。只是想知道是否有更方便/优雅的东西。 -
@maytham-ɯɐɥıλɐɯ 我还没解决。有关我想到的解决方法,请参阅上面的评论。
-
问题是,就像下面提到的那样,您在集合上调用 delete() 而不是实际对象本身。使用您的示例,您可以执行以下操作:
$org->products()->find($ids)->each(function($product){ $product->delete(); });
标签: php laravel laravel-5 eloquent laravel-5.1