laravel 5.2关系结果计数的雄辩顺序

时间:2016-05-31 04:42:59

标签: php laravel laravel-5 eloquent

我有两个表website_link和website_links_type。 website_link与具有hasmany关系的website_links_type相关。

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

和关系

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

现在我想从website_link表获得结果,但是Orderby会导致关系结果破坏。

2 个答案:

答案 0 :(得分: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);

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

答案 1 :(得分:0)

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

您只需在模型文件中提供 hasMany 的关系。

并使用控制器端的条件。

参考this文件。

试试这个

模型文件:

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

控制器文件:

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