【问题标题】:laravel advanced searchlaravel 高级搜索
【发布时间】:2015-04-17 03:58:22
【问题描述】:

我想进行高级搜索,其中用户有可选的参数来搜索,我正在连接三个表中的数据,如下所示

$qry="SELECT rooms.*, salereservation.*, customers.*
                FROM rooms
                    JOIN salereservation
                        ON salereservation.room_id = rooms.room_id
                    JOIN customers
                        ON customers.id = salereservation.customer_id
                WHERE salereservation.sale_status=1 AND ";

我将以下可选参数附加到查询字符串

if($fname!=''){
        $qry.="fname LIKE %fname% AND ";
    }
    if($lname!=''){
        $qry.="lname LIKE %:lname% AND ";
    }
    if($time_in!=''){
        $qry.="start_datetime LIKE %time_in% AND ";
    }
    if($time_out!=''){
        $qry.="end_datetime LIKE %time_out% AND ";
    }
    if($phone!=''){
        $qry.="phone LIKE %phone% AND ";
    }
    if($room_no!=''){
        $qry.="room_no LIKE %room_no%";
    }

我的问题是如何将代码变成 laravel 查询生成器

【问题讨论】:

    标签: php sql laravel


    【解决方案1】:

    我没有尝试此代码,但它应该在 laravel 4.2 下工作。

    $query = DB::table('rooms')
            ->join("salereservation", "salereservation.room_id", "=", "rooms.room_id")
            ->join("customers", "customers.id", "=", "salereservation.customer_id")
            ->where("salereservation.sale_status",'=',1)
            ->select('rooms.*', 'salereservation.*', 'customers.*');
    
    if($fname!=''){
        $query->where("fname",'like',"%$fname%");
    }
    
    if($lname!=''){
        $query->where("lname",'like',"%$lname%");
    }
    if($time_in!=''){
       $query->where("start_datetime",'like',"%$time_in%");
    }
    if($time_out!=''){
        $query->where("end_datetime",'like',"%$time_out%");
    }
    if($phone!=''){
        $query->where("phone",'like',"%$phone%");
    }
    if($room_no!=''){
      $query->where("room_no",'like',"%$room_no%");
    }
    $data = $query->get(); //finally get the result
    

    更新:

    对于查询验证,您可以使用以下方式打印查询:

     $queries = DB::getQueryLog();
     $last_query = end($queries);
     dd($last_query);
    

    并验证您的查询是否与您想要的查询不同。 如果有什么不同,我们可以根据它们升级我们的查询结构。您也可以使用从 laravel 方法生成的最新查询进行更新。

    但是如果你仍然面临一些困难来理解我的观点。告诉我。

    【讨论】:

    • 如果搜索任何内容,即使它在数据库中,我也会得到空结果
    • 现在我们可以管理我们的查询,只要按计划运行,就可以使用 $query 对象进行连接。
    • @safoor Safdar 是的,查询与我想要的查询完全一样
    • 好吧,很高兴看到,所以主要关心的是你想要的原始查询是否可以运行以生成所需的结果。你能确认一下吗?
    • 'select rooms.*, salereservation.*, customers.* 从rooms 内部连接salereservation salereservation.room_id = rooms.@ 987654331@ 内部连接customers customers.id = salereservation.customer_id 其中salereservation.sale_status = ?和phone 喜欢?'
    【解决方案2】:

    你必须像这样设置你的数据库:

    rooms:
     - id
     - room_no
    
    reservations:
     - customer_id
     - start_datetime
     - end_datatime
     - room_id
    
    customers:
     - lname
     - fname
     - phone
    

    然后在你的模型中设置属性关系

    //Reservation model
    class Reservation extends \Eloquent {
    
        public function room()
        {
            return $this->belongsTo('Room', 'room_id');
        }
    
        public function customer()
        {
            return $this->belongsTo('Customer', 'customer_id');
        }
    }
    

    创建如下查询范围:

    // Reservation model
    // $terms is an array which pairs column_name to the querying value
    public function scopeSearch($query, $terms)
    {
        if ( ! empty($terms['room_no']))
        {
            $query->has('rooms.room_no', $terms['room_no']);
        }
    
        $customer_cols = ['lname', 'fname', 'phone'];
        $reservations_cols = ['start_datetime', 'end_datetime'];
        foreach ($terms as $key => $value)
        {
            if (in_array($key, $customer_cols))
            {
                $query->whereHas('customer', function($subquery) use ($key, $value)
                {
                    $subquery->where($key, 'like', '%'.$value.'%');
                });
            }
            if (in_array($key, $reservation_cols))
            {
                $query->where($key, $value);
            }
        }
    
    }
    

    现在您可以通过执行以下操作来调用您的查询范围:

    $reservations = Reservation:search(array('fname' => 'value', 'lname' => 'value2', ...));
    

    并通过以下方式访问结果:

    foreach ($reservations as $res)
    {
        $res->room->number;
        $res->customer->name;
    }
    

    【讨论】:

      猜你喜欢
      • 2018-10-21
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2015-01-14
      • 2018-08-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-11
      相关资源
      最近更新 更多