我用搜索参数调用URL是动态的。我怎样才能形成正确的雄辩的查询?
理论上:
我需要这种结构,所以如果 param存在,我可以使用where子句。 如果Laravel有其他方式,请告诉我。
答案 0 :(得分:61)
Laravel很容易。做这样的事情:
$query = User::query();
if ($this == $that) {
$query = $query->where('this', 'that');
}
if ($this == $another_thing) {
$query = $query->where('this', 'another_thing');
}
if ($this == $yet_another_thing) {
$query = $query->orderBy('this');
}
$results = $query->get();
答案 1 :(得分:1)
You can use like this
$validateUserDetail = User::query();
if (!empty($userDetails['email'])) {
$validateUserDetail->whereemail($userDetails['email']);
}if (!empty($userDetails['cellphone'])) {
$validateUserDetail->wherecellphone($userDetails['cellphone']);
}
$validateUserDetail->select('username');
$validateUserDetail->get()
答案 2 :(得分:1)
您可以只使用where语句。
例如:在users
表或User
模型上,您需要动态搜索名称id。你可以做到
$where = [];
$firstName = $request->get('first_name');
if ($firstName) $where[] = ['first_name', 'like'. '%' . $firstName . '%'];
$id = $request->get('id');
if ($id) $where[] = ['id', $id];
$users = User::where($where)->get();
默认情况下,它将返回所有用户,如果$where
数组中存在任何内容,它将在其上应用where condition
。
答案 3 :(得分:0)
您可以通过以下示例传递动态值
$user_auctions = $this->with('userAuctions')
->where('users.id', '=', $id)
->get();
答案 4 :(得分:0)
我是从谷歌来的。如果你要迭代5个以上if语句,那么使用switch语句会更有效
if(empty($request->except('_token')))
return 'false';
$models = Vehicle::query();
$request_query = $request->all();
$year_switch = false;
foreach ($request_query as $key => $field_value){
if($field_value != 'any'){
switch($field_value){
case 'X':
case 'Y':
$year_switch = true;
break;
case'Z':
//Dynamic
$models->where($key,'LIKE', $field_value);
break;
}
}
}
答案 5 :(得分:0)
您可以将回调传递给where函数。
因此,您可以执行以下操作:
class TestService {
TestRepository $testeRepository;
public function __construct(TesteRepository $teste) {
$this->testeRepository = $teste;
}
public function getAll(array $filters)
{
$where = function (Builder $query) use ($filters) {
collect($filters)
->each(function ($value, $param) use ($query) {
if ($param === 'test') {
$query->where($param, '=', $value);
} else if ($param === 'test2') {
$query->orWhere($param, '>', $value);
}
});
};
return $this->testRepository->gelAll($where);
}
class TestRepository
{
public function getAll(\Closure $where)
{
$query = TestModel::query();
$query->where($where);
//and put more stuff here, like:
//$query->limit(15)->offset(30)
...
return $query->get();
}
}
然后在您的控制器中通过过滤器:
class TestControler ...
{
public function $index()
{
$filters = request()->query();
return $this->testService->getAll($filters);
}
}