Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Прошу помощи
Две таблицы. Записи и категории. Связь один ко многим. Как в представлении вывести к какой категории относится данная запись.
Одиночную запись я понял методом with(), а все в цикле не пойму.
Заранее прошу прощения за тривиальный вопрос для кого-то
//Модель записей
class Post extends Model
{
public function category(){
return $this->belongsTo('App\Models\Category', 'id');
}
}
//модель категорий
class Category extends Model
{
protected $table = 'categories';
public function posts(){
return $this->hasMany('App\Models\Post', 'cat_id');
}
}
//Метод контроллера
public function index()
{
$posts = Post::orderBy('created_at', 'desc')->paginate(10);
return view('admin.posts.main', ['posts' => $posts]);
}
//Вид
@if(!empty($posts))
<table class="posts">
@foreach($posts as $post)
<tr>
<td>{{$post->title}}</td>
<td>
КАК СЮДА ВСТАВИТЬ КАТЕГОРИЮ???
</td>
@if($post->public)
<td>Активна</td>
@else
<td>Неактивна</td>
@endif
<td>{{$post->description}}</td>
<td>{{$post->created_at->format('H:i:s / d.m.Y')}}</td>
<td>{{$post->updated_at->format('H:i:s / d.m.Y')}}</td>
<td><a href="{{ url('/admin/edit-post/'.$post->id) }}">Редактировать</a></td>
<td><a href="{{ url('/admin/delete-post/'.$post->id) }}">Удалить</a></td>
</tr>
@endforeach
</table>
{!! $posts->render() !!}
@endif
дописать категории к циклу постов
@foreach( $Posts as $Post )
{{$Post->title}} / {{$Post->category->title}}
@endforeach
показать посты в каждой категории
@foreach( $Categories as $Category )
{{$Category->title}}
@foreach( $Category->posts as $Post )
{{$Post->title}}
@endforeach
@endforeach
Не в сети
Можно как передать категории/посты в шаблон, предварительно их дёрнув с бд, так и заменить
$Categories на Category::all()
$Posts на Post::all()
-- дело вкуса и ТЗ
Не в сети
Если в цикле, то лучше использовать Eager Loading, иначе приложение пошлет 1001 запрос в БД на 1000 постов:
$categories = Category::with(['posts' => function ($q) {
$q->orderBy('created_at', 'desc');
}])->paginate(10);
Ну а потом перечислять в представлении:
@foreach ($categories as $category)
Post category: {{ $category->title }}
@foreach ($category->posts as $post)
<h1>{{ $post->title }}</h1>
<div>{{ $post->content }}</div>
@endforeach
@endforeach
Изменено AlexeyMezenin (13.08.2016 08:49:32)
Не в сети
естессно - лучше, я показал принцип, ибо новичок не понял ничего из документации (если читал, не знаю)
Не в сети
Спасибо, hzone , ваш способ не понял к сожалению. Спасибо AlexeyMezenin, попробовал ваш способ, но это не совсем то, что я хотел. Так я вывожу категории а в них посты, которые к ним относится. Мне нужно вывести таблицу постов, а в отдельной ячейке - категорию, к какой этот пост относится. При этом, посты могут быть и без категорий. Я не пойму одно, почему сделав выборку таким способом:
$posts = Post::with('category')->get();
Я не могу вывести название категории:
@foreach($posts as $post)
<tr>
<td>{{$post->title}}</td>
<td>
@foreach($post->category as $cat)
{{$category->cat_name}}
@endforeach
</td> ...
хотя через dd($posts) - категории видны
Я не пойму одно, почему сделав выборку таким способом я не могу вывести название категории
Попробуйте:
@foreach ($posts as $post)
<tr>
<td>{{ $post->title }}</td>
<td>
{{ $post->category->cat_name }}
</td> ...
Мне нужно вывести таблицу постов, а в отдельной ячейке - категорию, к какой этот пост относится.
Как вариант, добавить категорию "Без категории". Много потенциальных проблем решит, например, не нужно будет лепить ненужную дополнительную логику для select списка категорий при добавлении поста.
Изменено AlexeyMezenin (13.08.2016 15:25:09)
Не в сети
Короче, метод width() годится только для выборки одной строки. Решил проблему таким образом. Если кто может, посоветуйте лучший вариант )
//Выбираем два объекта:
public function index()
{
$posts = Post::orderBy('created_at', 'desc')->paginate(1);
$categories = Category::all();
return view('admin.posts.main', ['posts' => $posts, 'categories' => $categories]);
}
//Работаем с ними в представлении в циклах
@if(!empty($posts))
<table>
@foreach($posts as $post)
<tr>
<td>{{$post->title}}</td>
@if(!empty($categories))
@foreach($categories as $category)
@if($category->id == $post->cat_id)
<td>{{$category->cat}}</td>
@endif
@endforeach
@endif
Страницы 1