【问题标题】:Laravel Eloquent orWhere QueryLaravel Eloquent orWhere 查询
【发布时间】:2015-02-22 07:06:51
【问题描述】:

谁能告诉我如何用 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


    【解决方案1】:

    您可以通过三种方式进行操作。假设您有一个格式为

    的数组

    ['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();
      

    【讨论】:

    • 如果循环之前已经有 where 语句,3 会发生什么?
    【解决方案2】:

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

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

    将与以下内容相同:

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

    这种方法更好,也更有效 - 根据Mysql Manual,如果所有值都是常量,IN 对列表进行排序,然后使用二分查找。

    【讨论】:

      【解决方案3】:

      在 laravel 5 中你可以这样做。

      $projects = Projects::query();
      
      foreach ($selects as $select) {
          $projects->orWhere('id', '=', $select);
      }
      
      $result = $projects->get();    
      

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

      【讨论】:

      • 如果循环前已经有 where 语句会怎样?由于循环已经以 OR 开头,它不会失效吗
      • AFAIK 是的,它会失效
      【解决方案4】:
      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"]);
          }
      

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

      【讨论】:

        猜你喜欢
        • 2020-01-01
        • 1970-01-01
        • 2018-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-11-06
        • 1970-01-01
        • 1970-01-01
        • 2021-02-11
        相关资源
        最近更新 更多