Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5.8.*雄辩的查询(使用LeftJoin)返回不正确的关系结果_Php_Mysql_Laravel_Eloquent_Left Join - Fatal编程技术网

Php Laravel 5.8.*雄辩的查询(使用LeftJoin)返回不正确的关系结果

Php Laravel 5.8.*雄辩的查询(使用LeftJoin)返回不正确的关系结果,php,mysql,laravel,eloquent,left-join,Php,Mysql,Laravel,Eloquent,Left Join,我有一个在MySQL Workbench中工作的非常复杂的查询(如下),通过启用QueryLog输出的原始查询也会产生相同的查询 但是关系查询会产生奇怪的结果,因此它不是100%正确的 背景: -该应用程序包含事件、事件会话、门票和人员 -注册记录是在一个人购买活动门票时创建的 -RegSession记录是在用户预注册会话时创建的 -此查询旨在返回购买了包含所需会话的任何票证的人员,并指示是否已创建RegSession记录(最终有兴趣知道“hasAttended”==1的位置) mysql查询:

我有一个在MySQL Workbench中工作的非常复杂的查询(如下),通过启用QueryLog输出的原始查询也会产生相同的查询

但是关系查询会产生奇怪的结果,因此它不是100%正确的

背景: -该应用程序包含事件、事件会话、门票和人员 -注册记录是在一个人购买活动门票时创建的 -RegSession记录是在用户预注册会话时创建的 -此查询旨在返回购买了包含所需会话的任何票证的人员,并指示是否已创建RegSession记录(最终有兴趣知道“hasAttended”==1的位置)

mysql查询:

select distinct p.personID, p.firstName, p.lastName, op.OrgStat1, rs.hasAttended, er.regID
from `event-registration` as er
join `event-sessions` as es on es.eventID=er.eventID
join `person` as p on p.personID = er.personID
join `org-person` as op on p.defaultOrgPersonID = op.id 
left join `reg-session` as rs on rs.sessionID=es.sessionID 
                and rs.regID = er.regID 
                and rs.personID=er.personID 
                and es.sessionID=397
where er.ticketID in (335, 470, 330) 
    and er.eventID = 313 
    and es.sessionID in (397, null)
    and er.deleted_at is null 
order by p.lastName asc
$out = Registration::whereIn('event-registration.ticketID', $ticketIDs)
    ->select('p.personID', 'p.firstName', 'p.lastName', 'op.OrgStat1', 'rs.hasAttended', 'event-registration.regID')
    ->with('ticket', 'event', 'person.orgperson', 'regsessions', 'person')
    ->where('event-registration.eventID', '=', $es->eventID)
    ->join('person as p', 'p.personID', '=', 'event-registration.personID')
    ->join('org-person as op', 'p.defaultOrgPersonID', '=', 'op.id')
    ->join('event-sessions as es', 'es.eventID', '=', 'event-registration.eventID')
    ->leftJoin('reg-session as rs', function ($q) use ($es) {
        $q->where('rs.regID', '=', 'event-registration.regID');
        $q->where('rs.personID', '=', 'p->personID');
        $q->where('rs.sessionID', '=', 'es.sessionID');
        $q->where('es.sessionID', '=', $es->sessionID);
    })
    ->whereIn('es.sessionID', [$es->sessionID, null])
    ->distinct()
    ->orderBy('p.lastName')
    ->get();
array:6 [▼
  0 => array:3 [▼
    "query" => "select distinct `p`.`personID`, `p`.`firstName`, `p`.`lastName`, `op`.`OrgStat1`, `rs`.`hasAttended`, `event-registration`.`regID` from `event-registration` inner join `person` as `p` on `p`.`personID` = `event-registration`.`personID` inner join `org-person` as `op` on `p`.`defaultOrgPersonID` = `op`.`id` inner join `event-sessions` as `es` on `es`.`eventID` = `event-registration`.`eventID` left join `reg-session` as `rs` on `rs`.`regID` = ? and `rs`.`personID` = ? and `rs`.`sessionID` = ? and `es`.`sessionID` = ? where `event-registration`.`ticketID` in (?, ?, ?) and `event-registration`.`eventID` = ? and `es`.`sessionID` in (?, ?) and `event-registration`.`deleted_at` is null order by `p`.`lastName` asc ◀"
    "bindings" => array:10 [▼
      0 => "event-registration.regID"
      1 => "p->personID"
      2 => "es.sessionID"
      3 => 397
      4 => 335
      5 => 470
      6 => 330
      7 => 313
      8 => 397
      9 => null
    ]
    "time" => 60.77
  ]
  1 => array:3 [▼
    "query" => "select * from `event-tickets` where 0 = 1 and `event-tickets`.`deleted_at` is null"
    "bindings" => []
    "time" => 53.02
  ]
  2 => array:3 [▼
    "query" => "select * from `org-event` where 0 = 1 and `org-event`.`deleted_at` is null"
    "bindings" => []
    "time" => 55.63
  ]
  3 => array:3 [▼
    "query" => "select * from `person` where `person`.`personID` in (357, 495, 564, 701, 821, 920, 974, 995, 1029, 1230, 1244, 1272, 1330, 1356, 1357, 1386, 1802, 1834, 1895, 1915, 2044, 2086, 2104, 2130, 2156, 2171, 2239, 2260, 2436, 2478, 2497, 2579, 2630, 2677, 2698, 4637, 4709, 4738, 4755, 5396, 5442, 5747, 5943, 5961, 5965, 6282, 7748, 8206, 8249, 8284, 8330, 8369, 8371, 8518, 8538, 8540, 8544, 8548, 8549, 8557, 8561, 8570) and `person`.`deleted_at` is null ◀"
    "bindings" => []
    "time" => 55.9
  ]
  4 => array:3 [▼
    "query" => "select * from `org-person` where `org-person`.`id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ◀"
    "bindings" => array:62 [▶]
    "time" => 64.14
  ]
  5 => array:3 [▼
    "query" => "select * from `reg-session` where `reg-session`.`regID` in (14546, 14547, 14570, 14588, 14594, 14618, 14649, 14679, 14704, 14780, 14818, 14837, 14840, 14846, 14849, 14850, 14854, 14865, 14999, 15020, 15025, 15026, 15042, 15054, 15059, 15060, 15064, 15065, 15072, 15075, 15079, 15088, 15115, 15127, 15128, 15135, 15142, 15151, 15154, 15157, 15159, 15164, 15168, 15173, 15179, 15180, 15185, 15187, 15196, 15197, 15201, 15217, 15229, 15240, 15254, 15259, 15264, 15270, 15276, 15285, 15287, 15303) ◀"
    "bindings" => []
    "time" => 91.76
  ]
]
雄辩的对等词:

select distinct p.personID, p.firstName, p.lastName, op.OrgStat1, rs.hasAttended, er.regID
from `event-registration` as er
join `event-sessions` as es on es.eventID=er.eventID
join `person` as p on p.personID = er.personID
join `org-person` as op on p.defaultOrgPersonID = op.id 
left join `reg-session` as rs on rs.sessionID=es.sessionID 
                and rs.regID = er.regID 
                and rs.personID=er.personID 
                and es.sessionID=397
where er.ticketID in (335, 470, 330) 
    and er.eventID = 313 
    and es.sessionID in (397, null)
    and er.deleted_at is null 
order by p.lastName asc
$out = Registration::whereIn('event-registration.ticketID', $ticketIDs)
    ->select('p.personID', 'p.firstName', 'p.lastName', 'op.OrgStat1', 'rs.hasAttended', 'event-registration.regID')
    ->with('ticket', 'event', 'person.orgperson', 'regsessions', 'person')
    ->where('event-registration.eventID', '=', $es->eventID)
    ->join('person as p', 'p.personID', '=', 'event-registration.personID')
    ->join('org-person as op', 'p.defaultOrgPersonID', '=', 'op.id')
    ->join('event-sessions as es', 'es.eventID', '=', 'event-registration.eventID')
    ->leftJoin('reg-session as rs', function ($q) use ($es) {
        $q->where('rs.regID', '=', 'event-registration.regID');
        $q->where('rs.personID', '=', 'p->personID');
        $q->where('rs.sessionID', '=', 'es.sessionID');
        $q->where('es.sessionID', '=', $es->sessionID);
    })
    ->whereIn('es.sessionID', [$es->sessionID, null])
    ->distinct()
    ->orderBy('p.lastName')
    ->get();
array:6 [▼
  0 => array:3 [▼
    "query" => "select distinct `p`.`personID`, `p`.`firstName`, `p`.`lastName`, `op`.`OrgStat1`, `rs`.`hasAttended`, `event-registration`.`regID` from `event-registration` inner join `person` as `p` on `p`.`personID` = `event-registration`.`personID` inner join `org-person` as `op` on `p`.`defaultOrgPersonID` = `op`.`id` inner join `event-sessions` as `es` on `es`.`eventID` = `event-registration`.`eventID` left join `reg-session` as `rs` on `rs`.`regID` = ? and `rs`.`personID` = ? and `rs`.`sessionID` = ? and `es`.`sessionID` = ? where `event-registration`.`ticketID` in (?, ?, ?) and `event-registration`.`eventID` = ? and `es`.`sessionID` in (?, ?) and `event-registration`.`deleted_at` is null order by `p`.`lastName` asc ◀"
    "bindings" => array:10 [▼
      0 => "event-registration.regID"
      1 => "p->personID"
      2 => "es.sessionID"
      3 => 397
      4 => 335
      5 => 470
      6 => 330
      7 => 313
      8 => 397
      9 => null
    ]
    "time" => 60.77
  ]
  1 => array:3 [▼
    "query" => "select * from `event-tickets` where 0 = 1 and `event-tickets`.`deleted_at` is null"
    "bindings" => []
    "time" => 53.02
  ]
  2 => array:3 [▼
    "query" => "select * from `org-event` where 0 = 1 and `org-event`.`deleted_at` is null"
    "bindings" => []
    "time" => 55.63
  ]
  3 => array:3 [▼
    "query" => "select * from `person` where `person`.`personID` in (357, 495, 564, 701, 821, 920, 974, 995, 1029, 1230, 1244, 1272, 1330, 1356, 1357, 1386, 1802, 1834, 1895, 1915, 2044, 2086, 2104, 2130, 2156, 2171, 2239, 2260, 2436, 2478, 2497, 2579, 2630, 2677, 2698, 4637, 4709, 4738, 4755, 5396, 5442, 5747, 5943, 5961, 5965, 6282, 7748, 8206, 8249, 8284, 8330, 8369, 8371, 8518, 8538, 8540, 8544, 8548, 8549, 8557, 8561, 8570) and `person`.`deleted_at` is null ◀"
    "bindings" => []
    "time" => 55.9
  ]
  4 => array:3 [▼
    "query" => "select * from `org-person` where `org-person`.`id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ◀"
    "bindings" => array:62 [▶]
    "time" => 64.14
  ]
  5 => array:3 [▼
    "query" => "select * from `reg-session` where `reg-session`.`regID` in (14546, 14547, 14570, 14588, 14594, 14618, 14649, 14679, 14704, 14780, 14818, 14837, 14840, 14846, 14849, 14850, 14854, 14865, 14999, 15020, 15025, 15026, 15042, 15054, 15059, 15060, 15064, 15065, 15072, 15075, 15079, 15088, 15115, 15127, 15128, 15135, 15142, 15151, 15154, 15157, 15159, 15164, 15168, 15173, 15179, 15180, 15185, 15187, 15196, 15197, 15201, 15217, 15229, 15240, 15254, 15259, 15264, 15270, 15276, 15285, 15287, 15303) ◀"
    "bindings" => []
    "time" => 91.76
  ]
]
我的示例的SQL代码返回62个结果,其中37个有RegSession记录。由于rs.HASSATTED列中的左连接为null,因此返回了25条记录

根据数据库中的内容,我知道这是正确的

这些是Laravel正在生成的查询:

select distinct p.personID, p.firstName, p.lastName, op.OrgStat1, rs.hasAttended, er.regID
from `event-registration` as er
join `event-sessions` as es on es.eventID=er.eventID
join `person` as p on p.personID = er.personID
join `org-person` as op on p.defaultOrgPersonID = op.id 
left join `reg-session` as rs on rs.sessionID=es.sessionID 
                and rs.regID = er.regID 
                and rs.personID=er.personID 
                and es.sessionID=397
where er.ticketID in (335, 470, 330) 
    and er.eventID = 313 
    and es.sessionID in (397, null)
    and er.deleted_at is null 
order by p.lastName asc
$out = Registration::whereIn('event-registration.ticketID', $ticketIDs)
    ->select('p.personID', 'p.firstName', 'p.lastName', 'op.OrgStat1', 'rs.hasAttended', 'event-registration.regID')
    ->with('ticket', 'event', 'person.orgperson', 'regsessions', 'person')
    ->where('event-registration.eventID', '=', $es->eventID)
    ->join('person as p', 'p.personID', '=', 'event-registration.personID')
    ->join('org-person as op', 'p.defaultOrgPersonID', '=', 'op.id')
    ->join('event-sessions as es', 'es.eventID', '=', 'event-registration.eventID')
    ->leftJoin('reg-session as rs', function ($q) use ($es) {
        $q->where('rs.regID', '=', 'event-registration.regID');
        $q->where('rs.personID', '=', 'p->personID');
        $q->where('rs.sessionID', '=', 'es.sessionID');
        $q->where('es.sessionID', '=', $es->sessionID);
    })
    ->whereIn('es.sessionID', [$es->sessionID, null])
    ->distinct()
    ->orderBy('p.lastName')
    ->get();
array:6 [▼
  0 => array:3 [▼
    "query" => "select distinct `p`.`personID`, `p`.`firstName`, `p`.`lastName`, `op`.`OrgStat1`, `rs`.`hasAttended`, `event-registration`.`regID` from `event-registration` inner join `person` as `p` on `p`.`personID` = `event-registration`.`personID` inner join `org-person` as `op` on `p`.`defaultOrgPersonID` = `op`.`id` inner join `event-sessions` as `es` on `es`.`eventID` = `event-registration`.`eventID` left join `reg-session` as `rs` on `rs`.`regID` = ? and `rs`.`personID` = ? and `rs`.`sessionID` = ? and `es`.`sessionID` = ? where `event-registration`.`ticketID` in (?, ?, ?) and `event-registration`.`eventID` = ? and `es`.`sessionID` in (?, ?) and `event-registration`.`deleted_at` is null order by `p`.`lastName` asc ◀"
    "bindings" => array:10 [▼
      0 => "event-registration.regID"
      1 => "p->personID"
      2 => "es.sessionID"
      3 => 397
      4 => 335
      5 => 470
      6 => 330
      7 => 313
      8 => 397
      9 => null
    ]
    "time" => 60.77
  ]
  1 => array:3 [▼
    "query" => "select * from `event-tickets` where 0 = 1 and `event-tickets`.`deleted_at` is null"
    "bindings" => []
    "time" => 53.02
  ]
  2 => array:3 [▼
    "query" => "select * from `org-event` where 0 = 1 and `org-event`.`deleted_at` is null"
    "bindings" => []
    "time" => 55.63
  ]
  3 => array:3 [▼
    "query" => "select * from `person` where `person`.`personID` in (357, 495, 564, 701, 821, 920, 974, 995, 1029, 1230, 1244, 1272, 1330, 1356, 1357, 1386, 1802, 1834, 1895, 1915, 2044, 2086, 2104, 2130, 2156, 2171, 2239, 2260, 2436, 2478, 2497, 2579, 2630, 2677, 2698, 4637, 4709, 4738, 4755, 5396, 5442, 5747, 5943, 5961, 5965, 6282, 7748, 8206, 8249, 8284, 8330, 8369, 8371, 8518, 8538, 8540, 8544, 8548, 8549, 8557, 8561, 8570) and `person`.`deleted_at` is null ◀"
    "bindings" => []
    "time" => 55.9
  ]
  4 => array:3 [▼
    "query" => "select * from `org-person` where `org-person`.`id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ◀"
    "bindings" => array:62 [▶]
    "time" => 64.14
  ]
  5 => array:3 [▼
    "query" => "select * from `reg-session` where `reg-session`.`regID` in (14546, 14547, 14570, 14588, 14594, 14618, 14649, 14679, 14704, 14780, 14818, 14837, 14840, 14846, 14849, 14850, 14854, 14865, 14999, 15020, 15025, 15026, 15042, 15054, 15059, 15060, 15064, 15065, 15072, 15075, 15079, 15088, 15115, 15127, 15128, 15135, 15142, 15151, 15154, 15157, 15159, 15164, 15168, 15173, 15179, 15180, 15185, 15187, 15196, 15197, 15201, 15217, 15229, 15240, 15254, 15259, 15264, 15270, 15276, 15285, 15287, 15303) ◀"
    "bindings" => []
    "time" => 91.76
  ]
]
查看上面的关系查询,我不明白为什么要创建和运行“…其中0=1…”查询(我理解为自动失败)

当我查看从Laravel返回的第一个结果时,数据基本上是正确的(基于SQL输出),除了hasAttended字段显示为null之外,尽管(此人的)第一次注册在DB中确实有RegSession记录

最后,在启用雄辩查询的->select()部分之前,它提供的输出似乎是所有表的并集,这些表除了hasattined字段外基本上是正确的


感谢您的帮助。

Where子句定义为
$q->Where('rs.regID','=','event registration.regID')
将把关系列解释为带引号的字符串,所以最后的查询如下

... WHERE rs.regID = 'event-registration.regID' ...
解决方案是对联接使用
on()
方法:

->leftJoin('reg-sessionas-rs',函数($q)使用($es){
$q->on('rs.regID','=','event registration.regID'))
->on('rs.personID','=','p.personID')
->on('rs.sessionID'、'='、'es.sessionID')
->其中('es.sessionID','=',$es->sessionID);
})

我认为另一种可能的方法应该有效——像这样使用
DB::Raw()
$q->where('rs.regID','=',DB:Raw('event-registration.regID'))

如何使用雄辩的关系?$q->where('rs.personID','=','p->personID');看起来很奇怪,就像绑定[1]一样。这是错误的吗?试试这个
php->leftJoin('reg-sessionas-rs',函数($q)使用($es){$q->on('rs.regID','=','event registration.regID')->on('rs.personID','=','p.personID')->on('rs.sessionID','=','es.sessionID')->其中('es.sessionID','=','es->sessionID');)
@Constantine是的,这是个错误。我刚才用p.personID替换了它,但它没有改变结果。@Constantine你的第二个建议成功了。如果你把它写下来作为回答,我会认为你回答了这个问题。非常感谢。