目前,我正在开展一个多域和语言项目,其中视频可以重复使用不同的标题和描述。
与此问题相关的我的表与关系看起来像
posts >- videos >- videos_tags -< tags
id id id id
domain_id video_id
video_id tag_id
当然我已经创建了模型:Post,Video和Tag以及所有必需的关系。
我正在尝试的是通过我的Tag模型获取所有帖子并保持分页()功能。
我可以通过视频模型将所有标签链接到帖子。但是,当我尝试相反的方式时,我似乎没有保持pagination()功能。我已经尝试了很多,但似乎无法找到正确的解决方案。
我最接近(我认为)这段代码:
// App\Models\Tag
public function posts()
{
$posts = [];
foreach ($this->videos as $video)
{
foreach ($video->posts as $post)
{
if (!array_key_exists($post->id, $posts)) $posts[$post->id] = $post;
}
}
return \Illuminate\Database\Eloquent\Collection::make($posts);
}
欢迎在寻求答案期间遗漏的任何建议或文章:)
答案 0 :(得分:2)
在问这个问题之后,我有一个尤里卡时刻,并找到了解决方案。一种方法不是通过Tag模型获取Post模型,而是通过Post模型本身。
这就是我所做的:
class Shop
{
public double GetPrice(List<IProduct> products)
{
return products.Sum(x => x.GetPrice());
}
}
interface IProduct { double GetPrice(); };
class Pizza : IProduct
{
double GetPrice ()
{
return 5.0;//Get the price here.
}
}
这解决了在执行查询之前查询多对多关系并维护口才功能的问题。
答案 1 :(得分:1)
您可以在帖子模型上定义所谓的范围。
class Post {
/**
* Limit query to posts related to a given tag id.
*
* @param Builder $query The original query
* @param Integer $tag_id The tag id to filter for
* @return Builder The query with an additional where
*/
public function scopeHasTag($query, $tag_id)
{
// assumes that there is a 'tags' relation
return $query->whereHas('tags', function($tags_query) use ($tag_id) {
return $tags_query->where('id', $tag_id);
});
}
}
此范围允许您执行以下查询(hasTags
是从scopeHasTags
拉出来的。{/ p>
$posts = Post::query()->hasTag(10); // All posts related with tag id 10
return $posts->paginate();
以下是有关查询范围的官方文档:https://laravel.com/docs/5.2/eloquent#local-scopes