如何获得一个至少与N个相关的多个`hasmany`模型的随机模型

时间:2016-02-18 03:58:43

标签: mysql laravel random eloquent laravel-5.2

我正在尝试结合两个功能: - 获得随机模型 - ...但仅限于至少有1个相关模型

我的网址是entity/random 以下代码效果很好:

    if ($entityid == 'random') {
        $random = Entity::all()->random(1);
        return Redirect::to(trans('routes.entities') . '/' . $random->id);
    }

现在,我的Entity模型定义了两个关系:

public function comments()
{
    return $this->hasMany('App\Models\Comment', 'entity_id');
}

public function sources()
{
    return $this->hasMany('App\Models\Source', 'entity_id');
}

定义它们后,我可以按$object->comments->count()$object->sources->count()获取相关评论的数量。 我的数据库是MySQL。

Entities的大多数人都没有评论或来源。

Laravel Querying Relations Model::has('relation') doesn't work的启发 我能够获得一个至少有2条评论的随机模型:

$random = Entity::has('comments', '>=', DB::raw(2))->get()->random(1);
// produces an Entity with at least 2 comments

待办事项

如果两个关系计数中至少有一个(sources OR comments)至少为2,则如何选择随机模型。 也许...... orHas存在吗?

1 个答案:

答案 0 :(得分:1)

是的,有orHas方法。

您可以像这样使用它:

$random = Entity::has('comments', '>=', 2)->orHas('sources', '>=', 2)->get()->random(1);

其他一些说明:

DB::raw()语句不需要has()语法。曾经有一个需要这种语法的sqlite数据库的bug,但是自Laravel 4.1.25以来已经解决了。

此外,您可能希望更改获取随机实体的方式。使用当前代码,您将检索符合条件的每条记录,并为每个记录创建一个完整的Entity对象。您拥有的实体记录越多,此代码获得的速度就越慢。我会建议这样的事情:

$id = Entity::has('comments', '>=', 2)->orHas('sources', '>=', 2)->lists('id')->random(1);

$random = Entity::find($id);

首先,使用lists()方法获取符合条件的实体的所有ID。从Laravel 5.2开始,lists()返回一个集合。在该ID集合上使用random()方法选择一个id来获取。然后,find()表示一个id,因此只创建了一个Entity对象。