Size: a a a

Laravel для начинающих

2020 June 02

K

KOSUMOV | ALI in Laravel для начинающих
Andrey Helldar
Именно этот кусок выполняет или вообще весь метод контроллера?
Именно этот кусок, а так там и другие запросы есть же
источник

K

KOSUMOV | ALI in Laravel для начинающих
KOSUMOV | ALI
 $category = Category::where('slug', $slug)->firstorFail();

       $article = $category
           ->posts()
           ->where('id', '!=', $id)
           ->orderBy('created_at', 'DESC')
           ->limit(5)
           ->get();
вот этот
источник

AH

Andrey Helldar in Laravel для начинающих
Или не ошибся...

В твоём коде:

1-й запрос: $category = Category::where('slug', $slug)->firstorFail(); - один запрос

2-й запрос:  $article = $category->posts() - нет with, выполнит 5 запросов. В этом случае родительский объект не становится релейшеном. Его нужно явно указывать.

3-й запрос: $lastposts = Post::with('category') - выполнит ещё один запрос в категории.


Оптимальный вариант запроса будет следующий:

/*
* В роутах дожно быть так:
*
* ->get('{category:slug}/{post}', 'YourController@show');
*/
public function show(Category $category, Post $post)
{
   $articles = $category
       ->posts()
       ->where('id', '!=', $post->id)
       ->latest()
       ->take(5)
       ->get()
       ->map(function (Post $post) use ($category) {
           return $post->setRelation('category', $category);
       });

   $lastposts = Post::with('category')
       ->where('id', '!=', $post->id)
       ->latest()
       ->take(6)
       ->get(['id', 'title', 'created_at', 'counter', 'category_id']);

   /*$post->increment('counter');*/

   return view('post.view', compact('post', 'articles', 'lastposts'));
}

В этом случае должно быть всего 5 уникальных запросов: на конкретную категорию, на конкретный пост, на список постов для уже загруженной категории, четвёртый на последние посты и шестой на категории для них.
источник

AH

Andrey Helldar in Laravel для начинающих
@arhitektor95, сообщение выше для тебя.
источник

K

KOSUMOV | ALI in Laravel для начинающих
Andrey Helldar
@arhitektor95, сообщение выше для тебя.
Посмотрю, спасибо
источник

AH

Andrey Helldar in Laravel для начинающих
KOSUMOV | ALI
Посмотрю, спасибо
Лара свежая?
источник

K

KOSUMOV | ALI in Laravel для начинающих
7
источник

AH

Andrey Helldar in Laravel для начинающих
Отлично. Тогда этот код 100% должен работать.
источник

K

KOSUMOV | ALI in Laravel для начинающих
сейчас проверю
источник

AH

Andrey Helldar in Laravel для начинающих
KOSUMOV | ALI
сейчас проверю
->map(function (Post $post) use ($category) {
  return $post->setRelation('category', $category);
});

Этот участок нужен для того, чтобы не делать запрос в базу на категорию, которая уже находится в переменной.
Просто присваиваем её в нужный релейшен для каждой записи.
источник

AH

Andrey Helldar in Laravel для начинающих
KOSUMOV | ALI
сейчас проверю
Роуты не забудь поправить
источник

K

KOSUMOV | ALI in Laravel для начинающих
Andrey Helldar
Роуты не забудь поправить
  Route::get('{category:slug}/{post}', 'PostController@show')
       ->name('postshow')
       ->where('id', '^[0-9]+$');
источник

K

KOSUMOV | ALI in Laravel для начинающих
Missing required parameters for [Route: postshow] [URI: news/{category}/{post}]
источник

AH

Andrey Helldar in Laravel для начинающих
KOSUMOV | ALI
Missing required parameters for [Route: postshow] [URI: news/{category}/{post}]
Во вьюхах есть метод route('postshow')?
источник

K

KOSUMOV | ALI in Laravel для начинающих
да
источник

AH

Andrey Helldar in Laravel для начинающих
Проверь. Ругается на то, что обязательный параметр не передаёшь в него.
источник

AH

Andrey Helldar in Laravel для начинающих
Должно быть
route('postshow', ['category' => 'foo', 'post' => 1])
источник

AH

Andrey Helldar in Laravel для начинающих
Точно! Параметры метода же изменили на биндинг. До этого у тебя было slug, id, а стало category, post
источник

AH

Andrey Helldar in Laravel для начинающих
До:
route('postshow', ['slug' => 'foo', 'id' => 1])

После:

route('postshow', ['category' => 'foo', 'post' => 1])
источник

K

KOSUMOV | ALI in Laravel для начинающих
Andrey Helldar
До:
route('postshow', ['slug' => 'foo', 'id' => 1])

После:

route('postshow', ['category' => 'foo', 'post' => 1])
да, все четко \
источник