【问题标题】:Laravel ORM - filter by nameLaravel ORM - 按名称过滤
【发布时间】:2020-05-11 17:04:19
【问题描述】:

我是 Laravel 的新手,正在尝试使用 ORM 过滤我的结果。所以在我的数据库中,我有表一(开发人员)和表二(程序):

Developers
-------------------
ID.   | Name      |
------|------------
1     | Bluegreen |
2     | Dancer    |
3     | Martin    |
------|------------

Programs
-------------------------------------
id    | developer_id |   name       |
------|------------------------------
1     | 12           | Program Test |
2     | 3            | Capital      |
3     | 2            | Asus         |
4     | 2            | Rich         |
5     | 5            | Huna         |
------|------------------------------

我正在尝试按程序名称进行过滤,而我的代码正在按开发人员名称进行过滤。我可以在原始 sql 中轻松做到这一点,但我正在尝试学习 ORM,由于某种原因,这对我来说学习起来非常困难。

这是我的代码:

$query = $request->get('search');
$developers = Developer::where('name', 'LIKE', '%'.$query.'%')->with('programs')->get();

【问题讨论】:

  • 在 laravel 中使用关系型 Eloquient 查询

标签: laravel eloquent


【解决方案1】:

我认为这段代码会起作用。

DB::table('developers')
        ->join('programs','developers.id','=','programs.developer_id')
        ->where('programs.name', 'like', '%'.'Capital'.'%')
        ->select('programs.*','developers.name')
        ->get();

【讨论】:

  • 他正在尝试使用 ORM 而不是简单的加入。虽然对他来说也很简单。
【解决方案2】:

你可以简单地在 laravel 的闭包函数中使用关系来实现。这将过滤您在程序名称和开发人员名称上的记录。

$developers = Developer::where('name', 'LIKE', '%'.$request->search.'%')
              ->with(['programs' => function($filter) use ($request) { 
                 $filter->where('name','LIKE','%'.$request->search.'%');
              }])->get();

如果你只想按程序名称过滤,那么你可以这样做

$developers = Developer::with(['programs' => function($filter) use ($request) { 
                 $filter->where('name','LIKE','%'.$request->search.'%');
              }])->get();

如果$request->search 为空,您也可以编写一个条件,然后返回所有数据。如果它不为空,则只返回过滤后的数据。我只是简单地这样做,但您可以稍后优化查询。

if($request->search != '')
$developers = Developer::with(['programs' => function($filter) use ($request) { 
                 $filter->where('name','LIKE','%'.$request->search.'%');
              }])->get();
else
$developers = Developer::with('programs')->get();

【讨论】:

  • 按程序名称使用您的过滤器,它会将所有程序带回来,而不是按 $query 过滤。
  • 您是否在Develeper 模型中创建了programs 模型?
  • 查看更新的答案。在我的代码中它是过滤器而不是过滤器。我打错字了。
  • 结果确实有过滤后的搜索结果,但也有没有程序的所有结果。无论如何要在没有程序的情况下过滤结果并使用 $request->search? 返回结果
  • 是的,这是在开发者模型中: public function programs() { return $this->hasMany('App\Program'); }
猜你喜欢
  • 2021-10-23
  • 1970-01-01
  • 1970-01-01
  • 2015-04-04
  • 2015-12-11
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-01
相关资源
最近更新 更多