Laravel通过关系进行搜索

时间:2017-02-19 14:20:11

标签: php laravel eloquent

我以前曾试图在这个问题上寻求帮助,但我认为人们要么误解我的问题,要么不太了解我想要实现的目标,使用Eloquent / Laravel。

每个用户都有很多类别。每个类别都有很多文章。 我想从用户拥有的一组类别中检索所有文章。

所以说用户有类别1,类别2,我想要检索类别1和类别2中的所有文章。

对于下面这些belongsToMany关系中的每一个,我都有自己的数据透视表。

article_categories

id | articleID |的categoryId

users_cats

id | user_details_id | categories_id

关系。

Articles.php

public function categories()
{
    return $this->belongsToMany('App\Categories', 'article_categories', 'articleID', 'categoryID');
}

UserDetails.php

public function Categories()
{
    return $this->belongsToMany('App\Categories', 'users_cats', 'user_details_id', 'categories_id');
}

Categories.php

public function articles()
{
    return $this->belongsToMany('App\Article', 'article_categories', 'categoryID', 'articleID');
}

public function UserDetails()
{
    return $this->HasMany('App\UserDetails', 'users_cats', 'user_details_id', 'categories_id');
}

我已经尝试过使用HasMany,但据我所知,它并不适用于多对多的关系。

目前(作为一种“解决方法”)我一直在使用它。我已经提取了一个用户类别的列表,并搜索了所有ID,并在UserDetails.php中提取相关文章并从中形成一个集合

$user = self::find($this->id);
$user = $user->Categories;

foreach ($user as $item) {
    foreach ($item->articles as $article)
        $article1[] = Article::find($article->id);
}

$articles = collect($article1)->sortByDesc('date')->unique();

return $articles;

但是我不认为它会随着数据的增加而很好地扩展(它已经产生超过1k的查询,只有1000篇文章,加载时间超过8秒)。

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

尝试创建一个函数,用:

public function User_all_artical($id){
        $aricles=DB::table('articles') //open articles table
                    ->join('categories',function($join) use ($id)){ //join to categories table
                        $join->on('articles.categoryID','=','categories.id')//where from articles table the categoryID column === categories table ID column
                             ->where('categories.userID',$id); //where categories have user id ==$id
                    }
                    ->get();

    }

答案 1 :(得分:0)

您可以使用Nested eager loading

$user=User::with('categories.articles')->find(1);
foreach($user->categories as $category)
{
    echo $category->name;
    forech($category->articles as $article)
    {
       echo $article->name;
    }
}

答案 2 :(得分:0)

您可以将以下内容添加到UserDetails模型中:

public function articles()
{
    return $this->Categories()->getRelated()->articles()->getRelated()
        ->whereHas('Categories', function ($query) {
            $query->whereHas('UserDetails', function ($query) {
                $query->where('id', $this->id);
            });
        });
}

这样你就可以做到:

$user->articles()->orderBy('date', 'desc')->get();

希望这有帮助!