Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 12.08.2016 23:47:25

ДенисZ

Отображение связанных таблиц в цикле

Прошу помощи
Две таблицы. Записи и категории. Связь один ко многим. Как в представлении вывести к какой категории относится данная запись.
Одиночную запись я понял методом 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

#2 13.08.2016 01:09:13

Re: Отображение связанных таблиц в цикле

дописать категории к циклу постов

@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

Не в сети

#3 13.08.2016 01:11:05

Re: Отображение связанных таблиц в цикле

Можно как передать категории/посты в шаблон, предварительно их дёрнув с бд, так и заменить
$Categories на Category::all()
$Posts на Post::all()
-- дело вкуса и ТЗ

Не в сети

#4 13.08.2016 08:45:22

Re: Отображение связанных таблиц в цикле

Если в цикле, то лучше использовать 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)

Не в сети

#5 13.08.2016 12:15:20

Re: Отображение связанных таблиц в цикле

естессно - лучше, я показал принцип, ибо новичок не понял ничего из документации (если читал, не знаю)

Не в сети

#6 13.08.2016 12:29:29

ДенисZ

Re: Отображение связанных таблиц в цикле

Спасибо, 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) - категории видны

#7 13.08.2016 15:24:36

Re: Отображение связанных таблиц в цикле

ДенисZ пишет:

Я не пойму одно, почему сделав выборку таким способом я не могу вывести название категории

Попробуйте:

@foreach ($posts as $post)
    <tr>
        <td>{{ $post->title }}</td>
        <td>
            {{ $post->category->cat_name }}
        </td> ...

Мне нужно вывести таблицу постов, а в отдельной ячейке - категорию, к какой этот пост относится.

Как вариант, добавить категорию "Без категории". smile Много потенциальных проблем решит, например, не нужно будет лепить ненужную дополнительную логику для select списка категорий при добавлении поста.

Изменено AlexeyMezenin (13.08.2016 15:25:09)

Не в сети

#8 13.08.2016 18:45:37

ДенисZ

Re: Отображение связанных таблиц в цикле

Короче, метод 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

Подвал раздела