Laravel: «отправка» модели с отношением к Vue

#php #laravel #vue.js

#php #laravel #vue.js

Вопрос:

Я начинаю изучать, как использовать Vue и Laravel. Итак, я пишу некоторые компоненты Vue для замены некоторых частей лезвий.

В моем приложении у меня есть Sugerencia (предлагаемая) модель. Конечно, у меня есть users модели и многие другие, но мне нужны эти две для этого вопроса

Мой SugerenciaController@index довольно простой:

 public function index()
{
  $sugerencias = Sugerencia::orderBy('created_at', 'desc')
  ->with('user')
  ->paginate(10);
  return view('sugerencias.index', compact('sugerencias'));
}
  

В моем sugerencias/index.blade.php я «отправляю» $sugerencia в Vue с:

 @foreach ($sugerencias as $sugerencia)
   ...
   <user-info :sugerencia="{{ $sugerencia }}"></user-info>
   ...
@endforeach
  

И работает так, как задумано. user-info это компонент Vue, который форматирует и отображает информацию пользователя. В Vue для доступа к имени пользователя я использую {{ sugerencia.user.name }} в своем шаблоне. Пока все хорошо. Но это работает только в коллекции.

Тогда у меня есть свой SugerenciaController@show метод, который так же прост, как

 public function show(Sugerencia $sugerencia) {
  return view('sugerencias.show', compact('sugerencia'));
}
  

Я предположил, что в моем sugerenciasshow.blade.php я мог бы использовать тот же вызов для компонента user-info Vue, что и:

 ...
<user-info :sugerencia="{{ $sugerencia}}"></user-info>
...
  

… но я не могу, так как это не «отправка» user отношения. Я предполагаю, что это потому, что я не использую ->with('user') , как я делал в коллекции.

В mounted() методе, который я разместил console.log(this.sugerencia) , и я получаю все данные sugerencia, но не данные пользователя (только user_id внешний ключ)

Итак, вопрос в том, как мне «добавить» user отношение к sugerencia модели, вроде как нетерпеливая загрузка. Я хочу сделать что-то такое же тривиальное, как $sugerencia->user->name в ORM

Пожалуйста, простите меня, если мой английский недостаточно понятен, и не стесняйтесь редактировать

Ответ №1:

Честно говоря, я бы отделил логику здесь и загрузил страницу и компонент vue с нулевым значением, а затем выполнял запросы ajax для получения требуемых данных. Или реализовать стандартизированный способ получения данных от контроллера к компонентам vue без наличия определенных переменных в моих view шаблонах блейда.

Однако для вашего конкретного вопроса вы могли бы использовать отложенную загрузку eagar следующим образом:

 public function show(Sugerencia $sugerencia) {
  $sugerencia->load('user');
  return view('sugerencias.show', compact('sugerencia'));
}
  

Из документов:

Иногда вам может потребоваться загрузить отношения после того, как родительская модель уже была извлечена. Например, это может быть полезно, если вам нужно динамически решать, загружать ли связанные модели:

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

1. Отлично! Да, это решает мою проблему. Как я уже сказал, я начинаю с Vue. Итак, лучший способ сделать то, что я хочу, — это axios вызвать загрузку компонента для получения пользовательских данных? почему?

2. Я имею в виду, что в индексе это не будет похоже на проблему запроса n 1? Не эффективнее ли выполнить один запрос? Просто хочу узнать

3. На мой взгляд, да, получение ВСЕХ данных через ajax, потому что тогда вы можете начать создавать свое приложение vue с отдельными компонентами, которые все независимы друг от друга, как «модули». Вам не обязательно использовать ajax для всего, вы все равно можете передавать данные при загрузке страницы, но я бы не хотел делать это напрямую <user-info :sugerencia="{{ $sugerencia}}"></user-info> . Если вы хотите опубликовать новый вопрос с тем же кодом и задать что-то вроде «Как я могу передать данные из моего бэкэнда laravel в мое приложение vue без использования блейд-логики», я был бы рад показать вам пример

4. Я пытался, но он говорит, что он дублируется… позвольте мне попробовать и опубликовать еще раз с меньшим кодом. Я действительно ценю ваше время и знания, а также готовность поделиться