Laravel查询没有给出期望的结果

时间:2019-07-18 12:18:32

标签: laravel eloquent laravel-5.8

有人可以帮助解决此查询。查询返回“ j.code”和“ accounts.title”的空结果。而且我100%确信它应该返回结果。我认为我的左联接缺少一些东西。这是在左联接中使用左联接的正确方法。

$query = DB::table('autostk')
    ->where('autostk.branchid', $branch_id)
    ->where('autostk.itemcode',$request->itemcode)
    ->whereDate('autostk.date','<=',$request->tdate)
    ->leftjoin('journal AS j', function($join) use ($branch_id) {
        $join->on('autostk.refno', '=', 'j.vno')
            ->where('j.code', '>=', 100)
            ->where('j.branchid', $branch_id)
            ->where('j.vtype', '=', 'autostk.vtype')
            ->leftjoin('accounts', 'j.code', '=', 'accounts.code')
            ->where('accounts.branchid', $branch_id);
    })
    ->select('j.code','accounts.title','autostk.*')
    ->orderBY('date')->get()
    ->map(function ($item, $key) {
        return (array) $item;
    })
    ->all();

正在生成的原始查询是:

select `j`.`code`, `accounts`.`title`, `autostk`.* from `autostk`
left join (`journal` as `j` left join `accounts` on `j`.`code`=`accounts`.`code`)
on `autostk`.`refno` = `j`.`vno` and `j`.`code` >= ? and `j`.`branchid` = ?
and `j`.`vtype` = ? and `accounts`.`branchid` = ? where `autostk`.`branchid` = ?
and `autostk`.`itemcode` = ? and date(`autostk`.`date`) <= ? order by
`autostk`.`date` asc

更新: 在检查QueryLog时,我注意到'j'。'vtype'的绑定是“ autostk.vtype” 在工作台中使用“ autostk.vtype”应用查询返回空结果。 但是,当我将其更改为'autostk'。'vtype'时,结果正确显示。 如何在Laravel Eloquent中进行此更改?

3 个答案:

答案 0 :(得分:1)

->leftjoin('journal as j', function($join) use ($branch_id) {

as instead of AS

答案 1 :(得分:0)

请尝试如下操作:

$query = DB::table('autostk')
    ->where('autostk.branchid', $branch_id)
    ->where('autostk.itemcode',$request->itemcode)
    ->whereDate('autostk.date','<=',$request->tdate)
    ->leftjoin('journal as j', function($join) use ($branch_id) {
        $join->on('autostk.refno', '=', 'j.vno')
            ->where('j.code', '>=', 100)
            ->where('j.branchid', $branch_id)
            ->where('j.vtype', '=', 'autostk.vtype')
            ->leftjoin('accounts', 'j.code', '=', 'accounts.code')
            ->where('accounts.branchid', $branch_id);
    })
    ->select('j.code','accounts.title','autostk.*')
    ->orderBy('autostk.date')->get()
    ->map(function ($item, $key) {
        return (array) $item;
    })
    ->all();

有一个问题:

->orderBy('autostk.date')

您可以像这样使用toArray()代替map()

->orderBy('autostk.date')->get()->toArray();

答案 2 :(得分:0)

找到了解决方案。正确的查询是:

$query = DB::table('autostk')
    ->where('autostk.branchid', $branch_id)
    ->where('autostk.itemcode',$request->itemcode)
    ->whereDate('autostk.date','<=',$request->tdate)
    ->leftjoin('journal AS j', function($join) use ($branch_id) {
        $join->on('autostk.refno', '=', 'j.vno')
        ->on('autostk.vtype', '=', 'j.vtype')
            ->where('j.code', '>=', 100)
            ->where('j.branchid', $branch_id)
            ->leftjoin('accounts', 'j.code', '=', 'accounts.code')
            ->where('accounts.branchid', $branch_id);
    })
    ->select('j.code','accounts.title','autostk.*')
    ->orderBY('autostk.date')->get()
    ->map(function ($item, $key) {
        return (array) $item;
    })
    ->all();