gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 23:37:09 24 4
gpt4 key购买 nike

我正在尝试结合两个功能:- 获得一个随机模型- ...但前提是它至少有 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

要做

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

最佳答案

是的,有一个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对象。

关于mysql - 如何获得至少 N 个相关的多个 `hasmany` 模型的随机模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35472565/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com