为什么这个Laravel雄辩的查询会返回更多对象?

如何解决为什么这个Laravel雄辩的查询会返回更多对象?

我试图雄辩地找回一个与Laravel中的其他模型有关系的模型,但是我的查询不起作用。我想做的只是 显示带有相关组,单元和相关组件的dataLog并将其作为对象返回。参数$ componentId是唯一应该返回的组件,但它会返回其他 组件ID,组和单位。有没有办法只显示具有给定参数componentId的组件,而跳过其余不相关的组件?

<?   

   public function getLogData( $componentId,$limit ) {

        $dataLogs = Log::whereHas( 'groups',function( $group ) use (&$componentId) {
            $group->whereHas( "units",function( $unit ) use (&$componentId) {
                $unit->whereHas( "components",function( $component ) use (&$componentId) {
                    $component->where( "Component",$componentId );
                } );
            } );
        } )->take( $limit )->get();


        return response( )->json( $dataLogs );


    }
    
?>

回复是

[
{
    "Oid": 10409376,"Active": false,"Speed": "0","Weight": "0","Amount": "0","Code": "","Control": false,"Type": 1,"Event": 1,"Name": "TestName","Number": "","Mode": 0,"Recipe": "","DateTime": "2020-03-02 11:09:37.177","Check": 288,"groups": [
    {
        "Oid": 11162074,"Amount": "3.387","Cap": "0","ActTachoVoltage": "0","Act": "0","Weight": "497717","Codes": "","Name": "Group1","units": [
            {
            "Oid": 15934577,"Counter": 0,"components": [
                    {
                    "oId": 18168546,"component": 1102,"Entry": 15934577
                    }
                ]
            },{
            "Oid": 15934578,"component": 1101,}
]

给定查询所需的响应

[
{
    "Oid": 10409376,"components": [
            {
            "Oid": 15934578,}
]

如果给定的参数id是1101。有人知道我在做什么错吗?

模型和关系飞船

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class log extends Model
{

    // Define variables
    protected $primaryKey = 'Oid';
    protected $table = 'log';
    protected $connection = 'testdb';
    protected $appends = [ 'groups' ];

    // Functions
    public function getGroupsAttribute( )
    {
        if( $this->groups() )
            return $this->groups()->get();

        return [];
    }

    // Define model relationship logEntry = FK from log to group model 
    public function groups(){
        return $this->hasMany(groupLog::class,'logEntry');
    }

}


?>


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class groupLog extends Model
{

    // Define variables
    protected $primaryKey = 'Oid';
    protected $table = 'groupLog';
    protected $connection = 'testdb';

    // Functions
    public function getUnitsAttribute( )
    {
        if( $this->units() )
            return $this->units()->get();

        return [];
    }

    // Define database relationships
    public function log(){
        return $this->belongsTo(log::class);
    }

    // Define model relationship groupEntry = FK from log to group model 
    public function units(){
        return $this->hasMany(unitLog::class,'groupEntry');
    }


}

?>


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class unitLog extends Model
{

    // Define variables
    protected $primaryKey = 'Oid';
    protected $table = 'unitLog';
    protected $connection = 'testdb';
    protected $appends = [ 'components' ];

    // Functions
    public function getComponentsAttribute( )
    {
        if( $this->components() )
            return $this->components()->get();

        return [];
    }

    // Database relationships with models
    public function group(){
        return $this->belongsTo(groupLog::class);
    }

    public function components(){
        return $this->hasMany(componentLog::class,'unitEntry');
    }

}

?>


<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class componentLog extends Model
{
    // Define variables
    protected $primaryKey = 'Oid';
    protected $table = 'componentLog';
    protected $connection = 'testdb';

    // Define model database relationships
    public function units(){
        return $this->belongsTo(unitLog::class);
    }

}

?>

像这样尝试答案的方法


        $machineLogs = MachineLog::whereHas( 'groups',function($group) use ($componentId) {
            $group->whereHas( "units",function( $unit ) use ($componentId) {
                $unit->whereHas( "components",function( $component ) use ($componentId) {
                    $component->where("component",$componentId);
                } );
            } );
        } );

        $filterComponents = $machineLogs->with(['groups.units.components' => function ($query) use ($componentId) {
            $query->where('component',$componentId);
        }])->take($limit)->get();

        return response( )->json( $filterComponents );

    

解决方法

您正在查询具有给定单位的Log,并且无论它们具有什么ID,它将始终返回所有单位。您正在寻找的是使用with()来过滤关系。我仍然会使用您的完整查询,以获取正确的注销信息。

Log::yourQueries() // insert your existing queries here.
    ->with('groups.units.components' => function ($query) use ($componentId) {
        $query->where('component',$componentId);
    });

这将预加载组件并通过给定查询对其进行过滤,这将返回您的预期结果。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-