Как удалить строку, используя laravel 5.6 на движке InnoDB? - PullRequest
0 голосов
/ 28 апреля 2018

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

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

1 Ответ

0 голосов
/ 28 апреля 2018

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

...