当前位置: 首页 > 知识库问答 >
问题:

具有所有模型行的laravel belongsToMany

公冶弘壮
2023-03-14

我对用户和资源有很多关系。

用户:

    public function resources() {
        return $this->belongsToMany('Resource')->withPivot(array('value'));
    }

资源:

    public function users() {
        return $this->belongsToMany('User')->withPivot(array('value'));
    }

中间表是resource\u user。与:

$resources = Sentry::getUser()->resources()->get();

我获取资源用户表中用户id所在的所有资源。到现在为止,一直都还不错。但是,即使中间表中不存在用户id,如何获取所有资源条目呢?假设我在资源表中有3个资源。Id 1、2和3。我有一个ID为1的用户。在中间表中,我只有两行:

resource_id1和user_id1和值50。

resource_id2和user_id1和值100。

但是我想显示所有的资源,如果用户不在那里,应该有资源对象,但是没有用户的关系模型。

whereHas无法解决此问题。

所以我的目标是得到3个结果,而不是2个。大概是这样的:

资源\u id 1用户\u id 1值50

资源id 2用户id 1值100

resource_id3user_id0值0

我唯一能想到的是:

在资源模型中,我创建了如下函数:

    # Get specific User value from resource
    public function userValue() {
        $res_user = DB::table('resource_user')->whereUserId(Sentry::getUser()->id)->whereResourceId($this->id)->first();
    if($res_user){
        return $res_user->value;
    }else{
        return 0;
    }
}

但我想知道有没有一种更干净、更有说服力的方法?你知道吗?

共有1个答案

司空俊雄
2023-03-14

我不确定我是否完全理解您的意思,但要获得“所有资源”,您可以使用资源模型:

$resources = Resource::with('users')->get();

要仅急切加载当前用户,可以添加筛选闭包:

$resources = Resource::with(array('users' => function($q) use ($userId){
    $q->where('user_id', $userId);
}))->get();

 类似资料:
  • 有没有一种方法可以在Laravel中检索具有所有属性的模型,即使这些属性为空?它似乎只返回属性不为null的模型。 原因是我有一个函数,如果模型中存在属性,它将从数组中更新模型属性。在设置模型之前,我使用property_exists()函数检查模型是否具有特定属性。数组键和模型属性应该匹配,所以它就是这样工作的。 如果模型已经设置了属性,它可以正常工作,因为属性存在并从数组中获取值。但是,如果属

  • 问题内容: 我想检索限制为0,x的特定用户的所有行。 所以我只想问问有没有办法在不调用返回x&的count(id)的方法的情况下检索mysql中的所有行,而不会重载在查询和withour string中完全没有限制的现有函数的重载。 )功能。 因为在内部,当我们选中“显示所有”复选框时,mysql可能会使用它,然后显示taht表的所有行 问题答案: 一个简单的解决方案是将int的最大范围发送到方法

  • 问题内容: 我有一组服务器,每个服务器都装有一堆可以压缩的文件。服务器均具有不同数量的核心。如何编写bash脚本为每个核心启动gzip,并确保gzip没有压缩相同的文件? 问题答案: 如果您使用的是Linux,则可以使用GNU的xargs启动与内核一样多的进程。 find -print0 / xargs -0保护文件名中的空格 xargs -n 1表示每个文件一个gzip进程 xargs -P指定

  • 在默认(django admin)更改视图中使用自定义ModelForm,如果为仅具有视图权限的用户呈现表单(在django 2.1中新增),则会给我一个空变量。 这是我的代码: 根本原因与中元类的exclude属性有关。无论我对fields/exclude属性写了什么,模型的所有字段总是自动放入exclude列表,并防止被填充。这让我的代码崩溃了。 当然,我可以在self.fields中检查

  • 问题内容: 我花了一些时间想知道是否有可能编写一个guice模块,该模块本身使用类型T进行参数化,并使用其type参数指定绑定。 像在此示例(不起作用)中那样: 我尝试了不同的方法,试图将T作为类/ TypeLiteral的实例传递给MyModule,但没有一个起作用。帮助表示赞赏。 问候,zukasz Osipiuk 问题答案: 为此,您将必须使用从头开始构建每个TypeLiteral 。您可以

  • 本文向大家介绍Django 创建具有关系的模型,包括了Django 创建具有关系的模型的使用技巧和注意事项,需要的朋友参考一下 示例 多对一关系 最通用的选项。可以在您想要代表任何关系的任何地方使用 多对多关系 在内部,这是通过另一个表表示的。并ManyToManyField应放在将在表单上进行编辑的模型上。例如:Appointment将具有ManyToManyField被叫Customer,Pi