Laravel красноречивый whereIn с одним запросом - PullRequest
1 голос
/ 03 апреля 2019

В laravel я могу использовать многие правила where в виде массива, который запускает один запрос к базе данных, используя метод laravel eloquent where для получения необходимого результата.

Код:

$where = [];
$where[] = ['user_id', '!=', null];
$where[] = ['updated_at', '>=', date('Y-m-d H:i:s')];
if($request->searchTerm) {
    $where[] = ['title', 'like', '%' . $request->searchTerm . '%'];
}
Model::where($where)->get();

Часть вопроса:

Теперь мне нужно использовать метод Laravel Eloquent whereIn с параметрами массива, чтобы получить необходимый результат одним запросом.

Я пытался цикл метод, но с большим количеством запросов к базе данных.

Код:

$model = new Model;
$whereIn = []; 

$whereIn[] = ['date', '>=', Carbon::now()->subDays(10)];
$whereIn[] = ['user_role', 'candidate'];

if (!empty($scope) && is_array($scope)) {
    $whereIn[] = ['user_id', $scope];
}
if(is_array($employment) && !empty($employment)) {
    $whereIn[] = ['employment', $employment];
}
if(is_array($experience) && !empty($experience)) {
    $whereIn[] = ['experience', $experience];
}

foreach ($whereIn as $v) {
    $model = $model->whereIn($v[0], $v[1]);
}

dump($model->get());

Сначала я устал $model->whereIn($whereIn)->get() но это ошибка возврата. Возможно ли получить результаты одним запросом, используя whereIn без зацикливания?

Примечание: Мой $whereIn массив будет динамическим массивом!

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Поскольку ваша переменная $whereIn является массивом массивов, она будет работать следующим образом:

$model->whereIn($whereIn[0][0], $whereIn[0][1])->get();

Если это простой массив, вы можете использовать:

$model->whereIn($whereIn[0], $whereIn[1])->get();
0 голосов
/ 03 апреля 2019

Выполните в Eloquent

$model = Model::whereIn('id', array(1, 2, 3))->get();

Или используйте построитель запросов, затем:

$model = DB::table('table')->whereIn('id', array(1, 2, 3))->get();
0 голосов
/ 03 апреля 2019

whereIn - это функция построения запросов, поэтому вы не можете использовать ее непосредственно в модели.Вместо этого вы должны создать экземпляр построителя запросов.Я также предлагаю вам использовать when вместо операторов if:

$models = Model::when(!empty($scope) && is_array($scope), function ($query) use ($scope) {
    $query->whereIn('user_id', $scope);
})->when(!empty($employment) && is_array($employment), function ($query) use ($employment) {
    $query->whereIn('employment', $employment);
})->when(!empty($experience) && is_array($experience), function ($query) use ($experience) {
    $query->whereIn('experience', $experience);
})->get(); 

dump($models);

when по существу запускает функцию, когда первый параметр имеет значение true.Более подробно в документации под условные предложения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...