Я создаю простое веб-приложение для управления проектами, и у меня есть InnoDB в качестве движка таблиц, и, очевидно, я не могу удалить «компанию», владеющую хотя бы проектом, поэтому я попытался справиться с этим случаем, используя соответствующий дисплей сообщений об ошибках.
Моя цель - показать пользователю, что компания не может быть удалена, если у компании есть проекты, и мне это удалось, за исключением того, что когда я удалил все проекты этой конкретной компании из базы данных, я все равно получаю то же самое. сообщение «У компании есть проекты ...»
*/
public function destroy(Company $company)
{
$current = Company::find($company->id);
if ($current !== null){
$companiesProjects = $current->projects;
if ($companiesProjects === null){
if ($current->delete()){
return redirect()->route('companies.index')
->with('success', 'Company has been successfully deleted!');
}
}else{
return back()->withInput()->with('errors', 'Company has projects... it can\'t be deleted!');
}
}else{
return back()->withInput()->with('errors', 'Company does not exist!');
}
return back()->withInput()->with('errors', 'Company could not be deleted!');
}
}
Я пробовал другое решение, которое заключается в использовании объекта Project внутри функции после добавления его пространства имен в контроллер ресурсов, но, к сожалению, мой php-сервер перестает работать, и мой компьютер перестает отвечать, и у меня нет другого выбора, кроме перезагрузки ПК.
public function destroy(Company $company, Project $project)
{
$current = Company::find($company->id);
if ($current !== null){
$companiesProjects = Project::where('company_id', $company->id);
if ($companiesProjects === null){
/* if ($current->delete()){
//return redirect()->route('companies.index')
//->with('success', 'Company has been successfully deleted!');
}*/
echo 'null';
}else{
//return back()->withInput()->with('errors', 'Company has projects... it can\'t be deleted!');
}
}else{
//return back()->withInput()->with('errors', 'Company does not exist!');
}
//return back()->withInput()->with('errors', 'Company could not be deleted!');
}
Я только слежу за видеокурсом и потерялась в документе.






$company->projects вернет массив. Либо заполненный, либо пустой. Но в любом случае $company->projects === null вернет false.
Вам просто нужно сделать:
if (!$current->projects->count()) {
// Empty
} else {
// Not empty
}
Могу я также заинтересовать вас более чистой логикой?
if ($company->projects->isNotEmpty()) {
return back()->withInput()->with('errors', 'Company has projects... it can\'t be deleted!');
}
if (!$company->delete()) {
return back()->withInput()->with('errors', 'Company could not be deleted!');
}
return redirect()->route('companies.index')
->with('success', 'Company has been successfully deleted!');
$current = Company::find($company->id) не нужен. Поскольку вы используете привязку модели, $company либо уже будет экземпляром, либо маршрут вернет 404, что также устраняет необходимость в первом блоке if.
Хм да, ты прав. Пустая коллекция по-прежнему возвращает истину. Вместо этого вы можете сделать if (!$current->projects->count()). Это я тестировал
Вы действительно выиграли! За исключением забавного факта, что у меня все еще есть пара скобок под сообщением об успехе. Как вы думаете, что вызывает это?
@HamzaELjaouhari Не понимаю, что вы имеете в виду. Кстати, только что заметил, что вы делаете на 1 слишком много вызовов базы данных, вы используете привязку модели, что означает, что $company уже найдет Компанию по переданному id или вернет 404
Спасибо за просмотр моего кода и спасибо за более чистый код. Неприятно у меня то же сообщение «У компании есть проекты ... их нельзя удалить!». Я считаю, что условие неверно, и вместо этого должна быть функция, которая возвращает логическое значение. Кроме того, у меня есть переменная ошибок, установленная по умолчанию в "companies.index", которая отображает пустое окно ошибки без сообщения, но открывающая и закрывающая скобки "[]". Чрезвычайно странно ...