Данные, связанные с Laravel-8, в коллекции потеряны

#laravel-8

#laravel-8

Вопрос:

Я пытаюсь лучше ознакомиться с laravel / livewire. Я сталкиваюсь с проблемами с коллекциями со связанными данными. В моем компоненте я получаю данные из базы данных и сохраняю их в переменной со связанными данными. Когда я выполняю dd после извлечения, я вижу полную коллекцию со связанными данными. В моем bladefile у меня есть цикл foreach для отображения всех списков, и для каждого списка у меня есть foreachloop для отображения всех задач.

Но когда я хочу отредактировать список, я хочу показать один из списков в модальном виде с формой. Я вызываю функцию ‘edit_todo’ и хочу извлечь данные из своей коллекции, чтобы заполнить блейд-форму.

Но когда я смотрю на ту же переменную, что и раньше ($this-> todolists) в этой функции, связанные данные отсутствуют.

Это часть кода.

 class Dashboard extends Component
{
    public $todolists, $list_id, $todolist;

    public function render()
    {
        $this->todolists = TodoList::with('todos')->get();

        //dd($this->todolists); //<-- relationsproperty shows all todos from each list

        return view('livewire.dashboard');
    }

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    public function edit_todo($list_id)
    {
        dd($this->todolists);  //<-- relationsproperty is empty 

        $this->todolist = $this->todolists->where('id',$list_id)->with('todos')->first()->toArray();
    }
 

Есть предложения? Что я делаю не так?
Может быть, мне просто нужно снова получить данные из базы данных, но я хотел бы понять, почему это не работает.

Комментарии:

1. Вы пробовали? $this-> todolist = $this-> todolists->where(‘id’,$list_id)->first()

2. Проблема не в этой строке. Указанный выше dd приводит к сбору, но без связанных данных. Итак, в функции Render() переменная $this-> todolists содержит все мои списки задач, включая связанные задачи, но позже в функции edit_todo() переменная $this-> todolists содержит только списки задач, но не связанные задачи.

Ответ №1:

Переместите свою популяцию $todoLists в метод монтирования:

 public function mount()
{
    $this->todolists = TodoList::with('todos')->get();
}
 

Взгляните на https://laravel-livewire.com/docs/2.x/lifecycle-hooks и вы заметите, что метод рендеринга запрашивается только в самом конце. Если вам нужно, чтобы ваш $todoLists файл был заполнен по вашему усмотрению, переместите его вверх в списке крючков жизненного цикла.

Редактировать и дополнительно: mount() в LiveWire равно __construct() в любом другом классе, к которому мы привыкли. Что бы вы ни хотели «сконструировать», запишите это в метод mount .

Комментарии:

1. Спасибо, Дмитрий, я пробовал это, но результат тот же….

2. Я не проверял это сам @ErwinVanMaasakkers Возможно, вы обнаружили ошибку. На днях я просмотрел исходный код LiveWire, он написан на языке PHP более высокого уровня, который я не могу понять. Таким образом, мало кто может отлаживать код.