Laravel, Eloquent - method find() not found in App

146
28 ноября 2021, 11:00

Описываю метод destroy класса TasksController: Написал вот такую функцию:

public function destroy ($id) {
        $task = Task::find($id);
        $task->delete();
        return redirect()->route('tasks.index');
    }

find() не работает и если навести на него мышь, то пишет, что method find not found in App\Task.

Полный код контроллера:

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Task;
class TasksController extends Controller
{
    public function index () {
        $tasks = Task::getAllTasks();
        return view('tasks.index', compact('tasks'));
    }
    public function create () {
        return view('create');
    }
    public function store (Request $request) {
        $task = new Task;
        $task->fill($request->all());
        $task->save();
        return redirect()->route('tasks.index');
    }
    public function destroy ($id) {
        $task = Task::find($id);
        $task->delete();
        return redirect()->route('tasks.index');
    }
}

Очень много искал в интернете, но конкретных ответов не нашёл, в том числе на stackoverflow(eng). Пишут, что возможно я подключил что-то не так, но я не вижу ошибки. Направьте пожалуйста в нужную сторону.

Код используемой модели Task:

<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Task extends Model
{
    protected $fillable = ['body', 'id'];
    public static function getAllTasks () {
        return self::all();
    }
}

Самое странное, что методы fill(), save(), all() работают нормально.

Вношу дополнения. С момента начала вопроса нашёл такой интересный момент:

public function destroy ($id) {
    $task = Task::all()->find($id)->delete();
    return redirect()->route('tasks.index');
}

В таком случае find() успешно срабатывает, delete() срабатывает как нужно, но всё же подсвечивает unhandled\exception.

Можно ли при таком подходе считать вопрос закрытым?

Answer 1

Выполнить действия:

  1. Проверить, что класс App\Task наследует класс Illuminate\Database\Eloquent\Model
  2. Измени destroy метод так:
public function destroy ($id) {
    /** @var App\Task $task */
    $task = Task::find($id);
    $task->delete();
    // зачем тебе показывать страницы задачи? Ты же ее удалил.
    //return view('tasks.show', compact('task'));
    // лучше сделай редирект на страницу списка задач
    // тут будет работать, если у твоего ресурсного машрута имя `tasks`
    return redirect()->route('tasks.index');
}
  1. Выполнить команду в консоли composer dumpautoload
Answer 2

Проблема кроется в самом фреймворке, он почему-то не обнаруживает некоторые методы.

Решил проблему с помощью _ide_helper. Ссылка на источник решения, вопрос менее конкретный(обобщённый), но решение подходит: https://stackoverflow.com/questions/29439753/eloquent-orm-code-hinting-in-phpstorm

Решение: Написать в консоли в корне проекта - "php artisan ide-helper:models"

Answer 3

Попробуйте такой вариант

public function destroy ($id) {
        $task = new Task();
        $result = $task->find($id);
        .....
    }
Answer 4
public function destroy ($id) {
    $task = Task::all()->find($id)->delete();
    return redirect()->route('tasks.index');
}

Не корректный подход к удалению. В данном случае вы вытаскиваете ВСЕ задачи, а дальше работаете с коллекцией (то есть ищете первый подходящий по id)

Воспользуйтесь методом destroy или delete напрямую, чтобы не выбирать эту модель

public function destroy ($id) {
    $task = Task::destroy($id);
    return redirect()->route('tasks.index');
}
// or
public function destroy ($id) {
    $task = Task::where('id',$id)->delete(); // запрос будет работать сразу на удаление, вместо 2-х запросов(find и delete), будет 1 (delete)
    return redirect()->route('tasks.index');
}

А по поводу того, что пишет про неизвестный метод - это, как писали выше, проблема ide. Она решается путём подключения всех фасадов, но при этом возникали (лично у меня) другие проблемы. Поэтому не можно не обращать на это внимание. Они прекрасно работают.

READ ALSO
Извлечь данные в цикле php

Извлечь данные в цикле php

Прошу помочь с задачей: есть цикл, в котором выводяться личные сообщения, юзера с его рефером (собеседником)

94
CodeIgniter 3 выбор языка валидации

CodeIgniter 3 выбор языка валидации

есть скрипт проверяющий на валидацию, он рабочий, но нужно изменить язык, в папке system/language присутствует только английский язык

211
Как сделать запрос интервал дат

Как сделать запрос интервал дат

В mysql лежит дата в таком виде 2019-11-27 10:50:21

95