2016-05-31 72 views
0

我有两个表website_link和website_links_type。 website_link与hasmany关系相关的website_links_type。laravel 5.2雄辩秩序由关系结果计数

$this->website_links->where('id',1)->Paginate(10); 

和关系

public function broken() 
{ 
    return $this->hasMany('App\Website_links_type')->where('status_code','!=',"200"); 
} 

现在我想从website_link表,但排序依据上破碎的关系结果的数量导致的结果。

回答

0

您不能在模型文件中放置WHERE条件。

您只需给模型文件中的关系hasMany

并在控制器端使用条件。

请参阅this文件。

试试这个

型号文件:

public function broken() 
{ 
    return $this->hasMany('App\Website_links_type'); 
} 

Controller文件:

$model_name->website_links->where('id',1) 
      ->where('status_code','!=',"200") 
      ->orderBy('name', 'desc') 
      ->Paginate(10); 
+0

谢谢你的回答。而关于orderby关系破碎计数呢? –

+0

对于订单,您可以在控制器中使用orderBy()。并请更多指定关于**关系打破计数** –

+0

我不知道什么@KetavChotaliya正在谈论,但你可以在你的模型中放一个'where'子句就好了。如果未提供任何方法链,则关闭查询生成器并返回一个Eloquent集合。如果提供了更多的方法链,那么Builder关系将在最后附加更多的参数。 – Ohgodwhy

1

有很多方法来解决这个问题。在我的答案中,我会用我知道的两个。

您可以重载您的关系并使用函数sortBy()。不过,我不认为你可以在这个解决方案中使用paginate()功能。

例子:

$results = Website_link::with('website_links_type')->get()->sortBy(function ($website_link) { 

    return $website_link->website_links_type->count(); 

}); 

See this answer

您也可以使用原始查询来解决这个问题。有了这个解决方案,你仍然可以使用分页功能(我认为)。

例子:

$results = Website_link 

    ::select([ 
     '*', 
     '(
      SELECT COUNT(*) 
      FROM website_links_type 
      WHERE 
       website_links_type.website_link_id = website_link.id 
      AND 
       status_code <> 200 
     ) as broken_count' 
    ]) 

    ->orderBy('broken_count') 

    ->paginate(10); 

您可能需要更改列名以匹配您的数据库。