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

Laravel雄辩透视表通过对象集合上的透视列过滤

艾心远
2023-03-14

我有一个问题,正在寻找一个很好的解决方案。

我有这些db表:

  • 游戏对象
  • 游戏对象属性
  • 游戏\对象\游戏\对象\属性(轴)

游戏对象。php:

public function gameObjectAttributes()
    {
        return $this->belongsToMany('App\Models\GameObjectAttribute')->withPivot('value')->withTimestamps();
    }

GameObjectAttribute.php

public function gameObjects()
    {
        return $this->belongsToMany('App\Models\GameObject');
    }

现在,我试图获得所有GameObjectType的GameObject,并用透视列值过滤结果。

$this->model->where('name', $gameObjectTypesEnum)->first()->gameObjects()->join('game_object_game_object_attribute', 'game_objects.id', '=', 'game_object_game_object_attribute.game_object_id')->where('value', '=', '4')->get());

我在这里使用了一个连接,但是有没有办法用雄辩的关系来做呢?

这将返回给我所有“军队”类型的游戏对象:

$this->model->where('name', $gameObjectTypesEnum)->first()->gameObjects()->get();

“gameObjects()”返回我一个集合,在这里我不能调用类似

$this->model->where('name', $gameObjectTypesEnum)->first()->gameObjects()->withPivot('value', 3)->get();

或者

$this->model->where('name', $gameObjectTypesEnum)->first()->gameObjects()->gameObjectAttributes->wherePivot('value', 3)->get();

在这里,我可以迭代收集'gameObject()',并与Foreach检查支点是否有值=3,但一定有比这更好的解决方案。我是新来laravel...

另外

我试着去

>

  • 按GameObjectType获取所有游戏对象=

    GameObjectType::其中('name',$gameObjectTypesEnum)-

    然后,我尝试过滤pivot,以仅获取具有给定GameObjectType和pivot值(例如3)的游戏对象。

    -

    我做错了什么,或者用雄辩的语言是不可能做到的:-(

    提前谢谢大家。

    顺致敬意,

  • 共有2个答案

    微生欣怡
    2023-03-14

    如果我没有误解,

    ->wherePivot('value',4) 
    

    除了您的查询之外,还有一种雄辩的连接方式。

    宇文和同
    2023-03-14

    你可以这样做

     $gameObjects = GameObject::where('name', $gameObjectTypesEnum)->whereHas('gameObjectAttributes', function($query)
        {
            $query->where('value', 3); 
        })->get();
    
     类似资料:
    • 雄辩的关系如下: 商店属于许多商店时代(属于许多) 数据透视表(store\u day\u time\u stores)有一个名为“user\u id”的键,storedaytimes表有一个名为“date”的字段。 我想根据给定的“用户id(来自数据透视表)”和“开始”和“结束”日期(来自storedaytime表)过滤“storedaytimes”中的记录。 我现在的问题是 它产生了一个看起来

    • 我正在使用Laravel5.1进行CMS开发。我有一个简单的帖子结构,用户和用户都可以喜欢帖子。 帖子和用户有多对多关系,并使用数据透视表来表示关系。 职位模型有 用户模型有 我想列出用户的最新活动。例如。 Username1喜欢Post2 Username5喜欢Post9 用户名30喜欢Post25 我知道我必须像这样编写sql查询- 上面的查询工作正常,但有没有办法使用laravel雄辩?

    • 我试图创建一个关系,通过一个名为年级的模型访问一个名为注释的表,通过年级中的学生加载 年级模型和学生模型都属于其他模型 根据我的理解,不可能访问需要透视表的hasManyThrough关系(注释没有年级标识符,只有学生标识符) 我为Laravel 4@HasManyThrough找到了这些函数,它们具有一对多关系,但它给了我一个错误类“App\illumb\Database\Eloquent\Re

    • 当我从前端提交表单数据时,我正试图创建一个新记录,我正在绞尽脑汁思考如何才能做到这一点。我已经找了一些例子,但还没有找到什么好运气。因此,我正在为新的约定提交数据,并且我的约定与任务共享数据透视表关系。这是关系结构。 用户有许多任务 如果我提交数据来存储一个新的约定,同时我还想存储一个新的任务,那么我很难理解应该使用什么方法来完成这项任务。 我确实理解,我需要在填充透视表之前存在参与和任务。 订婚

    • 我有一个有两个透视表的表单。其中一个工作很好,但我似乎不能使第二个工作,尽管他们是相当相似的。不起作用的是一个名为'photos'的图像表和名为'releases'的表单上载。我使用“photo_id”和一个“release_id”字段将数据透视表称为“photo_releases”。 数据库透视表 下面是发布模式 和照片模式 和ReleaseController 此函数中使用了两个透视表。使用

    • 我有这种多对多的关系Laravel雄辩的关系模型是: 我可以在控制器中执行此操作: 在这里,我只通过直接枢轴关系获得email_subtype_id,但必须做额外的工作来获得相关的电子邮件子类型名称。 我需要获得电子邮件子类型名称[直接]从第三个模型电子邮件子类型关系oneTo很多[有很多和属性到]涉及到枢轴模型与电子邮件子类型模型使用类似的东西: 请帮忙!