Теперь, из того, что я вижу, должно было быть просто.Как удалить несколько записей с помощью Laravel Eloquent
Я хочу, чтобы иметь возможность удалять несколько записей из базы данных. У меня есть 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()
возвращается коллекция products
, соответствующих указанным идентификаторам.
Что мне не хватает?
PS: 1. У модели Product
есть несколько belongsTo
отношений с другими моделями. 2. product.destroy
код работает отлично, если я передать ему один id
EDIT Я думаю, я также пытаюсь понять, в чем разница между:
$org->products()->find($ids)->delete()
и
$org->products()->whereIn('id', $ids)->get()->delete()
есть? Из того, что я вижу, возвращаются find
и get
Collections
Было ли что-то неясно [документации здесь] (https://laravel.com/docs/5.1/eloquent#deleting-models)? В частности, метод 'destroy()'? – maiorano84
Я использовал эту [нить] (https://laracasts.com/discuss/channels/laravel/delete-multiple-records) в качестве ссылки. Я видел документацию, на которую вы ссылаетесь. Я немного нервничаю, вызывающ «Model :: destroy» с идентификаторами продукта, потому что злоумышленник может удалять продукты, принадлежащие другим «orgs» («orgs' имеет много« продуктов »). Я бы предпочел сначала найти записи (основанные на 'organization', принадлежащие пользователю), а затем удалить их. Я мог бы использовать цикл for ('n' query). Я также мог бы использовать запрос 'delete' с предложением' in'. Просто интересно, есть ли что-то более удобное/элегантное. –
@ maytham-ɯɐɥıλɐɯ Я еще не решил. См. Мой комментарий выше для обходных решений, которые я имею в виду. –