【问题标题】:How to get a random model with at least N related of multiple `hasmany` models如何获得与多个“hasmany”模型相关的至少 N 个随机模型
【发布时间】:2016-02-18 03:58:43
【问题描述】:

我正在尝试结合两个功能: - 得到一个随机模型 - ...但前提是它至少有 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() 获得相关cmets 的数量。 我的数据库是 MySQL。

我的大多数Entities 没有 cmets 也没有来源。

灵感来自Laravel Querying Relations Model::has('relation') doesn't work 我能够得到一个至少有 2 个 cmets 的随机模型:

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

要做的事情

仅当两个关系计数(sourcescomments)中的至少一个至少为 2 时,如何选择随机模型。 也许像orHas这样的东西存在?

【问题讨论】:

    标签: mysql laravel random eloquent laravel-5.2


    【解决方案1】:

    是的,有一个orHas 方法。

    你可以这样使用它:

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

    其他几点说明:

    has() 语句不需要DB::raw() 语法。曾经有一个需要这种语法的 sqlite 数据库的错误,但自 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对象。

    【讨论】:

    • 它有效。谢谢你。奇怪的是,我所有没有DB::raw(2) 的尝试都失败了。
    猜你喜欢
    • 1970-01-01
    • 2013-03-15
    • 2013-05-13
    • 1970-01-01
    • 1970-01-01
    • 2012-12-24
    • 2015-02-26
    • 2010-10-15
    • 1970-01-01
    相关资源
    最近更新 更多