#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 более высокого уровня, который я не могу понять. Таким образом, мало кто может отлаживать код.