【问题标题】:Laravel eloquent relation search not working properlyLaravel 雄辩的关系搜索无法正常工作
【发布时间】:2019-07-30 08:20:09
【问题描述】:

我是 laravel 的新手,面临着 eloquent 搜索查询的问题。我有两个表 assetsassets_maintenance。当用户搜索时,它们与资产模型 assets 中的 assets hasMany assets_maintenance 有关系

$data['reports'] = AssetMaintenance::with(['assets'])
    ->where('inspector_id',$tenant_inspector_id)
    ->where('maintenance_due_date','>=',Carbon::now()->startOfDay())
    ->whereHas('assets',function($query){
        $query->active();//is_delete=0
    })
    ->whereHas('assets',function($query) use($stext){
        $query->where('asset_reference','like',"%{$stext}%")
                ->orWhere('asset_detail','like',"%{$stext}%");

    })
    ->orWhereHas('assets.assetCategory',function($query) use($stext){
        $query->where('assets_category.name','like',"%{$stext}%");
    })
    ->orWhere('maintenance_due_date','like',"%{$stext}%")
    ->orWhere('maintenance_cost','like',"%{$stext}%")
    ->orderBy('maintenance_due_date','ASC')
    // ->toSql();
    ->paginate(10);

但它没有给我正确的结果。有时它给我另一个资产或检查员的记录。我想要inspector_id=?manitenance_due_date 大于nowassets 的结果是活动的意味着不被删除.

其他条件可选asset_reference,asset_detail,assets_category.name,maintenance_due_date,maintenance_cost

【问题讨论】:

  • 能不能显示两个db表结构
  • 添加你写关系方法的两个类的代码
  • 我添加了图片,资产表的Ist和asset_maintenance_table底部的第二个,请看一下
  • 你的意思是一个资产有很多asset_maintenance和assetManintenace属于Asset吗?你的问题不是很清楚。
  • @pseudoanime,是的,你是对的。

标签: laravel eloquent eloquent-relationship


【解决方案1】:

试试这个

$data['reports'] = AssetMaintenance::whereHas('assets',function($query) use($stext){
     $query->active()  //is_delete=0
     $query->where('asset_reference','like',"%{$stext}%")
            ->orWhere('asset_detail','like',"%{$stext}%");
})
->where('inspector_id',$tenant_inspector_id)
->where('maintenance_due_date','>=',Carbon::now()->startOfDay())
->orWhereHas('assets.assetCategory',function($query) use($stext){
    $query->where('assets_category.name','like',"%{$stext}%");
})
->orWhere('maintenance_due_date','like',"%{$stext}%")
->orWhere('maintenance_cost','like',"%{$stext}%")
->orderBy('maintenance_due_date','ASC')
// ->toSql();
->paginate(10);

【讨论】:

    【解决方案2】:

    这是一种误解优先级的情况,在语言中,&& / AND 将始终在 || / OR 之前计算。这意味着作为示例,您的查询的较短版本 inspector_id == x AND maintenance_due_date >= Now() AND maintenance_due_date like %text% OR maintenance_cost 像 %text%can be true if only maintenance cost is liketext`。因为该语句将被这样评估。

    inspector_id == x AND maintenance_due_date >= Now() AND maintenance_due_date like %text%` OR maintenance_cost like %text%
    

    将相等的语句转换成它的值

    false AND false AND false OR true
    

    因为 AND 具有更高的优先级,所以它们首先得到评估。

    false OR true
    

    最后评估为真,或者在其他情况下,如果某些搜索为真,您可以找到未链接到特定检查器的元素。

    将您的搜索逻辑包装在子 where 子句中,将获得您想要的结果。

    $data['reports'] = AssetMaintenance::with(['assets'])
        ->where('inspector_id',$tenant_inspector_id)
        ->where('maintenance_due_date','>=',Carbon::now()->startOfDay())
        ->whereHas('assets',function($query){
            $query->active();//is_delete=0
        })
    
        //here is the extra where
    
        ->where(function($query){
            $query->whereHas('assets',function($query) use($stext){
            $query->where('asset_reference','like',"%{$stext}%")
                    ->orWhere('asset_detail','like',"%{$stext}%");
    
            })
        ->orWhereHas('assets.assetCategory',function($query) use($stext){
            $query->where('assets_category.name','like',"%{$stext}%");
        })
        ->orWhere('maintenance_due_date','like',"%{$stext}%")
        ->orWhere('maintenance_cost','like',"%{$stext}%")
        ->orderBy('maintenance_due_date','ASC');
        })
    
        ->paginate(10);
    

    这将包装与搜索相关的 where 语句,因此正确的优先级将在那里,再次简短示例:inspector_id == x AND (maintenance_due_date like %text% OR maintenance_cost like %text%)

    【讨论】:

      猜你喜欢
      • 2018-09-09
      • 2018-07-26
      • 2017-06-28
      • 1970-01-01
      • 2016-06-30
      • 2018-01-11
      • 1970-01-01
      • 2015-03-14
      • 2018-11-28
      相关资源
      最近更新 更多