link_web
@link_web
Magento, Laravel, Zend, Shopify, Prestashop, WP

Test laravel framework?

Unit test case Unit test case Unit test case
  • Вопрос задан
  • 269 просмотров
Решения вопроса 1
xpert13
@xpert13
Full Stack Developer
$post = Posts::findOrNew($post_id);
Часто на этом месте я получаю ошибку о том что id == null

У вас должна быть явная проверка на null, либо, как советует Taylor Otwell - разные методы на сохранение нового экземпляра модели и редактирования существующего.

При добавлении поста я могу выбрать несколько категорий и эта связь запишется в таблицу post_catergories .
Скажите, правильно ли вообще я все это делаю?

Да, `sync` всё сделает как нужно.

Как я могу вывести список категорий и посты к ним в шаблоне?

Получаем посты вместе с категориями:
Category::with('posts')->get();
Доступ к списку постов категории имеем через метод
$category->posts

Как я могу вывести список всех категорий в шаблон с указанием для каждой категории количества постов ?

@foreach($categories as $category)
  <p>Category: {{ $category->name }} ({{ $category->posts->count() }})</p>
@endforeach


Много вопросов, не могу понять. Достался проект с Laravel 5.3

Читайте документацию, там всё это есть
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mr_T
@mr_T
Web-разработчик
$this->belongsToMany(Categories::class, 'category_post','category_id','post_id');


Во вторым аргументе указывается название таблицы связи. Или вы неправильно её написали в методе, или в вопросе (category_post или post_categories?). А последние 2 аргумента можно вообще опустить - ларавел сам додумается в данном случае (то есть просто возьмёт название класса + '_id').

public function category() { ... }

Стоит назвать categories, а то потом сами запутаетесь. Связь же многие-ко-многим, а название метода в ед. числе.
В остальном связи правильно прописаны.

А вот в контроллере проблема - метод findOrNew нужен не для того, чтобы в зависимости от наличия аргумента отдавать новую или существующую запись. Его задача в том, чтобы попытаться найти запись с переданным ID, и если найти таковую не удалось - вернуть свежий экземпляр. То есть совершенно логично, что он ругается на отсутствующий аргумент, так как он ему необходим для работы :)

Ещё момент - вы пытаетесь вызвать sync, хотя на момент вызова пост ещё может быть не создан. По причине того, что у свежесозданной записи ещё нет идентификатора, sync, очевидно, тоже упадёт с ошибкой, то есть предварительно нужно вызвать $post->save(). А ещё лучше saveOrFail(), который сразу кинет исключение, если не удалось сохранить запись.

Ну и Александр тут уже написал, что хорошая мысль разделить на 2 метода создание и редактирование элемента. По остальным вопросам, как, опять же, уже упоминалось, нужно читать документацию. У ларавел она очень понятная и хорошо структурированная (хотя и многого не охватывает, но для начала вполне достаточно информации).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы