Laravel использует paginate для данных отношений - PullRequest
0 голосов
/ 20 мая 2018

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

$categoryContents=ContentCategories::with('contents')->whereId($id)->latest()->paginate(10);

, который возвращает этот вывод:

    LengthAwarePaginator {#971 ▼
      #total: 1
      #lastPage: 1
      #items: Collection {#963 ▼
        #items: array:1 [▼
          0 => ContentCategories {#862 ▼
            #table: "contents_categories"
            ...
            #attributes: array:6 [▶]
            #original: array:6 [▶]
            ...
            #relations: array:1 [▼
              "contents" => Collection {#962 ▼
                #items: array:2 [▼
                  0 => Contents {#952 ▶}
                  1 => Contents {#953 ▶}
                ]
              }
            ]
            ...
          }
        ]
      }
      #perPage: 10
      #currentPage: 1
      #path: "http://127.0.0.1:8000/category/5"
      #query: []
      #fragment: null
      #pageName: "page"
    }

в этом пагинаторе я пытаюсь показать массив contents при просмотре с помощью этого кода:

@foreach($categoryContents->contents_categories->contents as $content)

@endforeach

но я получаю эту ошибку:

Undefined property: Illuminate\Pagination\LengthAwarePaginator::$contents_categories

какя могу показать эту структуру на paginator?

мои модели:

class ContentCategories extends Model
{
    ...

    public function contents()
    {
        return $this->belongsToMany(Contents::class);
    }
}

class Contents extends Model
{
    ...

    public function categories()
    {
        return $this->belongsToMany(ContentCategories::class);
    }
}

Ответы [ 2 ]

0 голосов
/ 20 мая 2018

Этот запрос:

$categoryContents=ContentCategories::with('contents')->whereId($id)->latest()->paginate(10);

не имеет большого смысла.Вы запрашиваете ContentCategory по идентификатору, который будет точно соответствовать 1 результату, но вы все еще используете latest(), который упорядочивает (ничего не упорядочивать в 1 строке) результаты, и вызываете paginate(10), что приведет к разбивке на страницырезультат (нечего разбивать на страницы в 1 строке).

Вы хотите разбить на страницы contents, а не родитель ContentCategories:

// whereHas to scope it only to the category with id = `$id`
$contents = Contents::whereHas('categories', function ($subQuery) use ($id) {
        $subQuery->where('id', $id);
    })
    // Order the cotnents
    ->latest()
    // Paginate the contents
    ->paginate(10);

Затем передайте $contents вашемупросмотреть и foreach над ним:

@foreach($contents as $content)

@endforeach
0 голосов
/ 20 мая 2018

вы можете решить эту проблему следующим образом:

  $categoryContents = ContentCategories::with('contents')->whereId($id)->latest()->paginate(10);
    $categoryContents->getCollection()->transform(function ($item) {
        return $item->contents;
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...