Как удалить строку с помощью laravel 5.6 на движке InnoDB?

Я создаю простое веб-приложение для управления проектами, и у меня есть 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!');
}

Я только слежу за видеокурсом и потерялась в документе.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
0
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

$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.

Спасибо за просмотр моего кода и спасибо за более чистый код. Неприятно у меня то же сообщение «У компании есть проекты ... их нельзя удалить!». Я считаю, что условие неверно, и вместо этого должна быть функция, которая возвращает логическое значение. Кроме того, у меня есть переменная ошибок, установленная по умолчанию в "companies.index", которая отображает пустое окно ошибки без сообщения, но открывающая и закрывающая скобки "[]". Чрезвычайно странно ...

user9115388 28.04.2018 22:04

Хм да, ты прав. Пустая коллекция по-прежнему возвращает истину. Вместо этого вы можете сделать if (!$current->projects->count()). Это я тестировал

DevK 28.04.2018 22:09

Или даже более явный ->isNotEmpty(): if ($current->projects->isNotEmpty())

DevK 28.04.2018 22:12

Вы действительно выиграли! За исключением забавного факта, что у меня все еще есть пара скобок под сообщением об успехе. Как вы думаете, что вызывает это?

user9115388 28.04.2018 22:13

@HamzaELjaouhari Не понимаю, что вы имеете в виду. Кстати, только что заметил, что вы делаете на 1 слишком много вызовов базы данных, вы используете привязку модели, что означает, что $company уже найдет Компанию по переданному id или вернет 404

DevK 28.04.2018 22:17

Другие вопросы по теме