Я использую Laravel 4 и Eloquent ORM. В моей системе, когда кто-то удаляет запись, он должен проверить, есть ли у нее связанные записи. Если это не так, то он может быть удален навсегда. Но если это так, просто выполните мягкое удаление.
Способ обработки этой ситуации: попробуйте принудительно удалить, и если он выдает исключение из-за ссылочной целостности, перехватите его и выполните softDelete. Я знаю, что это выглядит бесполезно, но это было сделано другим разработчиком, и я бы не хотел связываться с его кодом.
Что он сделал, так это удалил, а затем, если он выдал исключение, просто установил флаг, чтобы «деактивировать» запись. Это сработало хорошо. Однако, когда я вступил во владение, я внедрил softDeleting, чтобы сделать вещи менее бесполезными.
Теперь, когда он пытается принудительно удалить, он выдает исключение QueryException, но не попадает в блок catch. Я пытался изменить Exception на \Exception, QueryException, Illuminate\Database\QueryException, но безуспешно. Любые идеи?
Чтобы проиллюстрировать это лучше:
Это было так:
try
{
$contact->delete();
}
catch(Exception $ex)
{
$contact->status = 0;
$contact->save();
//this works
}
А теперь вот так:
protected $softDelete = true;
....
try
{
$contact->forceDelete();
}
catch(Exception $ex)
{
$contact->delete();
//this doesn't work
}
Ответ пожарного жука:
{"error":{"type":"Illuminate\\Database\\QueryException","message":"SQLSTATE[23000]: Integrity constraint violation: 1451
Cannot delete or update a parent row: a foreign key constraint fails (`tst_db\/contact_company`, CONSTRAINT `fk_contact_company_contacts_id`
FOREIGN KEY (`contact_id`) REFERENCES `contacts` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE)
(SQL: delete from `contacts` where `id` = 28)","file":"\/Applications\/XAMPP\/xamppfiles\/htdocs\/application\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php","line":555}}
Это функция forceDelete() из Illuminate/Database/Eloquent/Builder.php:
public function forceDelete()
{
return $this->query->delete();
}
Exception
. Например, на этой странице filp.github.io/whoops/demo отображаетсяRuntimeException
, поэтому вы поймал бы его с помощьюcatch(RuntimeException)
в блоке try/catch. Можете ли вы также опубликовать свою функциюforceDelete()
, возможно, есть основная проблема, которая вызывает эти исключения. Если запрос плохой, это все равно не будет иметь значения. - person user1669496   schedule 19.06.2014app/storage/logs/laravel.log
? - person Unnawut   schedule 19.06.2014