Laravel Eloquent 或Where 查询

问题描述 投票:0回答:5

有人可以告诉我如何用 Eloquent 编写这个查询吗?

SELECT * FROM `projects` WHERE `id`='17' OR `id`='19'

我在想

Project::where('id','=','17')
        ->orWhere('id','=','19')
        ->get();

此外,在本例中,我的变量(17 和 19)来自多选框,因此基本上位于一个数组中。有关如何循环并动态添加这些 where/orWhere 子句的任何线索吗?

谢谢。

php laravel eloquent where-clause
5个回答
24
投票

您可以通过三种方式做到这一点。假设您有一个以下形式的数组

['myselect' => [11, 15, 17, 19], 'otherfield' => 'test', '_token' => 'jahduwlsbw91ihp']
,这可能是
\Input::all();

的垃圾场
  1.    Project::where(function ($query) {
          foreach(\Input::get('myselect') as $select) {
             $query->orWhere('id', '=', $select);
          }
       })->get();
    
  2.    Project::whereIn('id', \Input::get('myselect'))->get();
    
  3.    $sql = \DB::table('projects');
       foreach (\Input::get('myselect') as $select) {
           $sql->orWhere('id', '=', $select);
       }
       $result = $sql->get();
    

18
投票

这种情况的最佳方法是使用 Laravel 的 SQL 等效方法

IN()

Project::whereIn('id', [17, 19])->get();

将与:

相同
SELECT * FROM projects WHERE id IN (17, 19)

这种方法更好,也更高效 - 根据 Mysql 手册,如果所有值都是常量,

IN
对列表进行排序,然后使用二分搜索。


4
投票

在 Laravel 5 中你可以这样做。

$projects = Projects::query();

foreach ($selects as $select) {
    $projects->orWhere('id', '=', $select);
}

$result = $projects->get();    

如果您的项目模型上有自定义方法并且需要从变量进行查询,那么这非常有用。您不能在 orWhere 方法中传递

$selects


1
投票
public function getSearchProducts($searchInput)
    {
        $products = Cache::rememberForever('getSearchProductsWithDiscountCalculationproducts',  function () {
            return DB::table('products_view')->get();
        });

        $searchProducts = $products->filter(function ($item) use($searchInput)  {
            return preg_match('/'.$searchInput.'/i', $item->productName) || preg_match('/'.$searchInput.'/i', $item->searchTags) ;
        });

         $response = ["status" => "Success", "data" => $searchProducts ];
        return response(json_encode($response), 200, ["Content-Type" => "application/json"]);
    }

对任何自定义情况使用过滤功能。


0
投票

其他答案正确指出

Project::whereIn('id', \Input::get('myselect'))->get();
Project::whereIn('id', [17, 19])->get();

是正确的解决方案,但是,有时您的标准不一定与同一领域相关,您需要将它们添加为

orWhere
。对于此类场景,您可以执行以下操作:

function orWhere($query, $criterias) {
    for ($index = 0; $index < count($criterias); $index++) {
        $func = ($index === 0) ? "where" : "orWhere";
        $query = $query->{$func}(...$criterias[$index]);
    }
    return;
}

然后您可以执行以下操作:

$query = orWhere($query, [
    [
        ['id', '=', '19'],
        ['name', '=', 'John']
    ]
]);
© www.soinside.com 2019 - 2024. All rights reserved.