Laravelマルチ条件クエリーの使用方法
11948 ワード
メソッド1、whereと匿名関数を直接使用する方法:
[php] view plain
copy
$list = DB::table($this->table)
->join('user', 'user.id', '=', $this->table . '.user_id')
->where(function($query) use($data) {
if (!empty($data['order_sn'])) {
$query->where($this->table . '.order_sn', 'like', '%' . $data['order_sn'] . '%');
}
})
->where(function($query) use($data) {
if (isset($data['order_status']) && is_numeric($data['order_status'])) {
$query->where($this->table . '.order_status', '=', $data['order_status']);
}
})
->where(function($query) use($data) {
if (isset($data['ship_status']) && is_numeric($data['ship_status'])) {
$query->where($this->table . '.ship_status', '=', $data['ship_status']);
}
})
->where(function($query) use($data) {
if (isset($data['pay_status']) && is_numeric($data['pay_status'])) {
$query->where($this->table . '.pay_status', '=', $data['pay_status']);
}
})
->where(function($query) use($data) {
if (!empty($data['start_time']) && !empty($data['end_time'])) {
$query->where($this->table . '.update_time', '>=', $data['start_time'])
->where($this->table . '.update_time', '<=', $data['end_time']);
} else if (!empty($data['start_time'])) {
$query->where($this->table . '.update_time', '>=', $data['start_time']);
} else if (!empty($data['end_time'])) {
$query->where($this->table . '.update_time', '<=', $data['end_time']);
}
})
->where($this->table . '.drugstore_id', '=', 0)
->where($this->table . '.user_id', '!=', 0)
->select($this->table . '.id as id',
$this->table . '.order_sn as order_sn',
$this->table . '.order_status as order_status',
$this->table . '.ship_status as ship_status',
$this->table . '.pay_status as pay_status',
$this->table . '.total_paid as total_paid',
$this->table . '.update_time as update_time',
'user.nickname as name',
'user.mobile as phone',
$this->table . '.is_remittance as is_remittance')
->orderBy($sortby, $sortvalue)
->take($data['pageSize'])
->skip($data['pageNo'] > 1 ? ($data['pageNo'] - 1) * $data['pageSize'] : 0)
->get();
方法2:when法と匿名関数を用いる
https://d.laravel-china.org/docs/5.4/queries#conditional-clauses
場合によっては、値がtrueの場合にクエリーを実行する必要があります.この
別の閉パケットを3番目のパラメータとして
[php] view plain
copy
$list = DB::table($this->table)
->join('user', 'user.id', '=', $this->table . '.user_id')
->where(function($query) use($data) {
if (!empty($data['order_sn'])) {
$query->where($this->table . '.order_sn', 'like', '%' . $data['order_sn'] . '%');
}
})
->where(function($query) use($data) {
if (isset($data['order_status']) && is_numeric($data['order_status'])) {
$query->where($this->table . '.order_status', '=', $data['order_status']);
}
})
->where(function($query) use($data) {
if (isset($data['ship_status']) && is_numeric($data['ship_status'])) {
$query->where($this->table . '.ship_status', '=', $data['ship_status']);
}
})
->where(function($query) use($data) {
if (isset($data['pay_status']) && is_numeric($data['pay_status'])) {
$query->where($this->table . '.pay_status', '=', $data['pay_status']);
}
})
->where(function($query) use($data) {
if (!empty($data['start_time']) && !empty($data['end_time'])) {
$query->where($this->table . '.update_time', '>=', $data['start_time'])
->where($this->table . '.update_time', '<=', $data['end_time']);
} else if (!empty($data['start_time'])) {
$query->where($this->table . '.update_time', '>=', $data['start_time']);
} else if (!empty($data['end_time'])) {
$query->where($this->table . '.update_time', '<=', $data['end_time']);
}
})
->where($this->table . '.drugstore_id', '=', 0)
->where($this->table . '.user_id', '!=', 0)
->select($this->table . '.id as id',
$this->table . '.order_sn as order_sn',
$this->table . '.order_status as order_status',
$this->table . '.ship_status as ship_status',
$this->table . '.pay_status as pay_status',
$this->table . '.total_paid as total_paid',
$this->table . '.update_time as update_time',
'user.nickname as name',
'user.mobile as phone',
$this->table . '.is_remittance as is_remittance')
->orderBy($sortby, $sortvalue)
->take($data['pageSize'])
->skip($data['pageNo'] > 1 ? ($data['pageNo'] - 1) * $data['pageSize'] : 0)
->get();
方法2:when法と匿名関数を用いる
https://d.laravel-china.org/docs/5.4/queries#conditional-clauses
場合によっては、値がtrueの場合にクエリーを実行する必要があります.この
where
文は、例えば、入力要求に指定された入力値が存在する場合に実行される.when
の方法で実現できます.$role = $request->input('role');
$users = DB::table('users')
->when($role, function ($query) use ($role) {
return $query->where('role_id', $role);
})
->get();
when
メソッドの最初のパラメータがtrue
である場合にのみ、閉パケット内のwhere
文が実行されます.最初のパラメータがfalse
の場合、この閉パケットは実行されません.別の閉パケットを3番目のパラメータとして
when
メソッドに渡す可能性があります.この閉パケットは、最初のパラメータの値がfalse
の場合に実行される.この機能の使用方法を説明するには、デフォルトのソートのクエリーを構成します.$sortBy = null;
$users = DB::table('users')
->when($sortBy, function ($query) use ($sortBy) {
return $query->orderBy($sortBy);
}, function ($query) {
return $query->orderBy('name');
})
->get();