Коллекция запросов с условиями Eloquent Laravel - PullRequest
0 голосов
/ 12 сентября 2018

У меня сложный запрос, который зависит от моих параметров, я вам все объясню:

Вот моя структура таблиц:

licencies : 
-id 
-lb_name
-type_licence_id
-valid_licence_id 



licencies_medias : 
-id
-licencie_id
-file path

Я фактически сделал запрос, который возвращает коллекцию лицензий с двумя или более файлами (licencies_medias)

 $licencies = $query->whereIn('type_licence_id' , [1 , 2 , 3 , 4 , 5])
        ->whereIn('statut_licence_id', ['1' , '4'])
        ->where('valid_licence_id', '1')
        ->has('medias', '>=', 2)
        ->orderBy('lb_name' , 'asc')
        ->paginate(10);

Моя проблема в том, что количество носителей зависит от type_licence_id :

Например, лицензиату с type_licence_id = 1 необходимо иметь 3 licencies_medias (файлы)

лицензиату с type_licence_id = 2 необходимо иметь 4 licencies_medias (файлы)

Мне нужно создать запрос, который может проверить эти условия и отобразить все лицензии, которые имеют правильное количество файлов для права type_licence_id и отображать их вместе

На самом деле в моей модели у меня есть:

// on licencies model
public function medias()
{
    return $this->hasMany(LicenciesMedias::class , 'licencie_id');
}

// on licenciesMedia model
public function licencie()
{
    return $this->belongsTo(Licencies::class , 'licencie_id);
}

РЕДАКТИРОВАТЬ, похоже, он работает с методом сбора слияний, только еще одна проблема, когда я пытаюсь отфильтровать запрос, я не получаю результата: здесь полный контроллер:

    public function licenceToValidFromFede(Request $request)
    {


//        $licencies_to_search = Licencies::select('structure_id', 'num_licence', 'lb_nom' , 'lb_prenom' , 'id')
//            ->whereIn('type_licence_id' , [1 , 2 , 3 , 4 , 5])
//            ->whereIn('statut_licence_id', ['1' , '4'])
//            ->where('valid_licence_id', '1')
//            ->get()
//            ->mapWithKeys(function($i) {
//                return [$i->id => $i->num_licence.' - '.$i->lb_nom. ' ' .$i->lb_prenom. ' - ' .$i->structure->num_structure. ' ' .$i->structure->nom_structure];
//            });

        $type_licence = Type_licence::pluck('lb_type' , 'id');

        $activite = ActiviteLicencie::pluck('lb_activite' , 'id');

        $structure = Structure::select('num_structure', 'nom_structure' , 'id')
            ->get()
            ->mapWithKeys(function($i) {
                return [$i->id => $i->num_structure.' - '.$i->nom_structure];
            });

        $catg_licence = CatgLicence::pluck('lb_catg_lic' , 'id');


        $query = Licencies::query();

        $filters = [
            'structure' => 'structure_id',
            'type_licence' => 'type_licence_id',
            'activite_licencie' => 'activite_licencie_id',
            'assurance' => 'lb_assurance_etat',
            'catg_licence' => 'catg_licence_id',

        ];


        foreach ($filters as $key => $column) {
            if ($request->has($key)) {
                $query->where($column, $request->{$key});

            }
        }

//        $licencies = $query->whereIn('type_licence_id' , [1 , 2 , 3 , 4 , 5])
//            ->whereIn('statut_licence_id', ['1' , '4'])
//            ->where('valid_licence_id', '1')
//            ->has('medias', '=', 2)
//            ->orderBy('lb_nom' , 'asc')
//            ->paginate(10);


        $licencies_id_1 = $query->where('type_licence_id' , 1)
            ->whereIn('statut_licence_id', ['1' , '4'])
            ->where('valid_licence_id', '1')
            ->has('medias', '>=',  2)
            ->get();

        $licencies_id_2 = $query->where('type_licence_id' , 2)
            ->whereIn('statut_licence_id', ['1' , '4'])
            ->where('valid_licence_id', '1')
            ->has('medias', '>=', 3)
            ->get();


        $licencies_id_3 = $query->where('type_licence_id' , 3)
            ->whereIn('statut_licence_id', ['1' , '4'])
            ->where('valid_licence_id', '1')
            ->has('medias', '>=', 3)
            ->get();

        $licencies_id_4 = $query->where('type_licence_id' , 4)
            ->whereIn('statut_licence_id', ['1' , '4'])
            ->where('valid_licence_id', '1')
            ->has('medias', '>=', 3)
            ->get();

        $licencies_id_5 = $query->where('type_licence_id' , 5)
            ->whereIn('statut_licence_id', ['1' , '4'])
            ->where('valid_licence_id', '1')
            ->has('medias', '>=', 3)
            ->get();

        $all_licencies = $licencies_id_1->merge($licencies_id_2);
        $all_licencies = $all_licencies->merge($licencies_id_3);
        $all_licencies = $all_licencies->merge($licencies_id_4);
        $all_licencies = $all_licencies->merge($licencies_id_5);

        $licencies = $all_licencies;

        $perPage = 15;
        $paginator = new Paginator($licencies, $perPage);

        return view('licencie/validerFromFede' , compact('licencies' ,'licencies_to_search' , 'type_licence' , 'activite' , 'structure' , 'catg_licence' ,'paginator'));
    }

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018
//You can get all licenses and getting their medias using laravel with relation

$licenses = License::whereIn('type_licence_id' , [1 , 2 , 3 , 4 , 5])
           ->where('valid_licence_id', '1')
           ->with('medias')
           ->get();

// This will get license medias based on the relation defined in the License model. 
// You can get an idea from this, as you should not request individually for each type of 'type_license_id'.
0 голосов
/ 12 сентября 2018

Вы можете сделать это с большим количеством запросов.

Foreach версия

        $filters = [
            'structure' => ['structure_id', 1, 3]
            'type_licence' => ['type_licence_id',2 ,4]

        ];


        $all_licencies = collect();          

        foreach ($filters as $key => $column) {
            if ($request->has($key)) {
                $licencies = $query->where($column[0], $request->{$key});
                    ->where('statut_licence_id', $column[1])
                    ->whereIn('statut_licence_id', ['1' , '4'])
                    ->where('valid_licence_id', '1')
                    ->has('medias', '=', $column[2])
                    ->get();

                $all_licencies = $all_licencies->merge($licencies);

            }

        }

Версия с жестким кодом

 $licencies_id_1 = $query->where('type_licence_id' , 1)
        ->whereIn('statut_licence_id', ['1' , '4'])
        ->where('valid_licence_id', '1')
        ->has('medias', 3)
        ->get();

 $licencies_id_2 = $query->where('type_licence_id' , 2)
        ->whereIn('statut_licence_id', ['1' , '4'])
        ->where('valid_licence_id', '1')
        ->has('medias', 4)
        ->get();

Тогда вы можете объединить их.

$all_licencies = $licencies_id_1->merge($licencies_id_2);
$all_licencies = $all_licencies->merge($licencies_id_3);

и так далее. И заказал его в конце.

$ordered_licencies = $all_licencies->sortBy('lb_name');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...