如何将来自两个不同来源的帖子传递到相同的 blade 视图但按日期排序
How to pass posts from two different sources to the same blade view but to be sorted by date
标题看似有点复杂,其实很简单。
我有一个 Post 模型 table 和所有东西,在 Post 控制器中我将帖子传递给视图
在我的控制器中,我从 API 获取我的文章并将其传递给 $articles 变量,我从数据库获取我的文章并将其传递给 $posts 变量
public function index()
{
$articles = Http::withHeaders([
'api-key' => config('services.devto.key'),
])->get('http://dev.to/api/articles/me/published');
$articles = json_decode($articles, true);
return view('posts.index', [
'posts' => Post::latest()->filter(request(['search', 'category', 'author']))->paginate(6)->withQueryString(),
'articles' => $articles
]);
}
我可以将两者传递给同一个视图并按照下面的方式进行操作,它工作正常
<div class="lg:grid lg:grid-cols-3">
@foreach ($posts->skip($posts->onFirstPage() ? 3 : 0) as $post)
<x-postCard :post="$post" />
@endforeach
@foreach ($articles as $article)
<x-articlepostcard :article="$article" />
@endforeach
</div>
这给了我 6 个帖子,因为我对它们进行了分页,然后在我从我的 API 中获得所有 10 篇文章之后,然后在第 2 页我得到了另外 6 个帖子,在它们下面是相同的 10 个文章再次重复,因为我无法对它们进行分页,因为它们只是 json 在一个变量中。
关于如何让我的视图显示帖子和文章完全按日期分页和排序的任何想法?
您可以创建一个 data transfer object 来表示 post 或一篇文章。
例如(假设您使用的是PHP 8):
class ArticleDTO {
public __construct(
public string $title,
public string $content,
public Carbon $published_at,
)
{
}
}
然后,您获取您的文章和 posts,并将它们中的每一个实例化到 DTO 中并从中创建一个集合
$articleCollection = collect();
foreach ($articles as $article) {
$articleCollection->push(
new ArticleDTO(
$article->title,
$article->content,
$article->published_at
)
);
}
// Do the same for the posts
然后您可以将按日期排序的集合传递给您的视图。
return view('posts.index', [
'articles' => $articleCollection->sortBy('published_at'),
]);
注意这个解决方案
为了保持分页正常工作,您可能需要 manually invoke the paginator 但是您仍然会在每次请求时加载所有数据。
标题看似有点复杂,其实很简单。 我有一个 Post 模型 table 和所有东西,在 Post 控制器中我将帖子传递给视图
在我的控制器中,我从 API 获取我的文章并将其传递给 $articles 变量,我从数据库获取我的文章并将其传递给 $posts 变量
public function index()
{
$articles = Http::withHeaders([
'api-key' => config('services.devto.key'),
])->get('http://dev.to/api/articles/me/published');
$articles = json_decode($articles, true);
return view('posts.index', [
'posts' => Post::latest()->filter(request(['search', 'category', 'author']))->paginate(6)->withQueryString(),
'articles' => $articles
]);
}
我可以将两者传递给同一个视图并按照下面的方式进行操作,它工作正常
<div class="lg:grid lg:grid-cols-3">
@foreach ($posts->skip($posts->onFirstPage() ? 3 : 0) as $post)
<x-postCard :post="$post" />
@endforeach
@foreach ($articles as $article)
<x-articlepostcard :article="$article" />
@endforeach
</div>
这给了我 6 个帖子,因为我对它们进行了分页,然后在我从我的 API 中获得所有 10 篇文章之后,然后在第 2 页我得到了另外 6 个帖子,在它们下面是相同的 10 个文章再次重复,因为我无法对它们进行分页,因为它们只是 json 在一个变量中。
关于如何让我的视图显示帖子和文章完全按日期分页和排序的任何想法?
您可以创建一个 data transfer object 来表示 post 或一篇文章。
例如(假设您使用的是PHP 8):
class ArticleDTO {
public __construct(
public string $title,
public string $content,
public Carbon $published_at,
)
{
}
}
然后,您获取您的文章和 posts,并将它们中的每一个实例化到 DTO 中并从中创建一个集合
$articleCollection = collect();
foreach ($articles as $article) {
$articleCollection->push(
new ArticleDTO(
$article->title,
$article->content,
$article->published_at
)
);
}
// Do the same for the posts
然后您可以将按日期排序的集合传递给您的视图。
return view('posts.index', [
'articles' => $articleCollection->sortBy('published_at'),
]);
注意这个解决方案
为了保持分页正常工作,您可能需要 manually invoke the paginator 但是您仍然会在每次请求时加载所有数据。