Laravel 5.2 |查询多对多

时间:2016-05-23 14:26:44

标签: php laravel eloquent

目前,我正在开展一个多域和语言项目,其中视频可以重复使用不同的标题和描述。

与此问题相关的我的表与关系看起来像

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);
}

欢迎在寻求答案期间遗漏的任何建议或文章:)

2 个答案:

答案 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