代码之家  ›  专栏  ›  技术社区  ›  senty

在查询生成器中,计算这两个字段的最干净方法是什么?

  •  1
  • senty  · 技术社区  · 6 年前

    first_name , mid_name last_name 我模型中的字段。我收到两个字段( name , 姓氏 )有邮政要求。我肯定 姓氏 当然可以,但我想比较一下 第一姓 中名 有名字。

    这里的问题是,我不想重复我自己,但我想不出一个更干净的方式。

    $query = User::where('last_name', $request->last_name);
    
    if ($request->name) {
        $query = $query->where('first_name', $request->name);
    }
    
    $result = $query->get();
    

    如果我锁链, ->orWhere('mid_name', $request->name) 在if语句中,我将重复自己,以便重新检查姓氏。

    我试着划分这条线:

    $query = User::where('last_name', $request->last_name);
    

    但它甚至找不到姓氏(可能是因为我正在访问类?):

    $query = User::class;
    $lastnameQuery = $query->where('last_name', $request->last_name);
    

    你将如何处理这样的场景,以干净的方式实现它?

    1 回复  |  直到 6 年前
        1
  •  1
  •   The Alpha    6 年前

    使用A orWhere 很容易做到,例如:

    $query = User::where('last_name', $request->last_name);
    
    if ($request->name) {
        $query = $query->where(function($query) use ($request) {
            $query->where('first_name', $request->name)
                  ->orWhere('mid_name', $request->name);
        });
    }
    
    $result = $query->get();
    

    这个 closure 要求在此单独应用 何处 只有在 first_name mid_name ,因此伪查询如下:

    WHERE last_name = 'doe' AND (first_name = 'john' OR mid_name = 'john')