Как получить объекты данных результатов поиска из представления в контроллер - PullRequest
0 голосов
/ 08 апреля 2020

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

Я сделал разные функции для сортировки по расстоянию (геолокация, заданный адрес или простой выбор зоны), поэтому Пока я делал тесты с Model::all();, и они отлично работают.

Я добавил поисковый фильтр на мою модель, и он работает.

Дело в том, что я хочу получить результаты в такие данные, как $ FilterResults, а затем использовать различные функции с одинаковыми $ фильтромResults.

Я хочу, чтобы пользователь мог сортировать результаты поиска с помощью различных кнопок / функций.

Как получить результаты поиска, которые представляют собой данные объекта, из представления в контроллер.

Мое представление ( например, при установке только одной кнопки, я не буду беспокоить вас несколькими кнопками для сортировки по расстоянию ):

<!-- FILTER FORM -->    
<form method="POST" action="/events/search" class="w-50">
    @csrf
    <input name="Nom" id="Nom" type="text" class="form-control" placeholder="Nom de l'évènement" />
    <input type="text" class="form-control" placeholder="Type d'évènement" id="Type" name="Type" />
    <input name="lieu" id="lieu" type="text" placeholder="Lieu de l'évènement" class="form-control" />
    <button class="btn btn-outline-secondary" type="submit">Filtrer</button>
</form>

<!-- SORTING METHODS -->
<!-- AROUND ME -->
<!-- BY ADDRESS -->
<!-- BY AREA / ZONE -->
<a class="stpierre" href="/events/St-Pierre">Saint-Pierre</a>

<!-- TABLE DISPLAYING EVENTS --> 
<table class="table table-bordered table-striped">
    <thead class="text-center thead-dark">
        <tr>
            <th scope="col">ID</th>
            <th scope="col">Nom</th>
            <th scope="col">Thématique</th>
            <th scope="col">Lieu</th>
            <th scope="col">Type</th>
            <th scope="col">Programme</th>
            <th scope="col">Objectif</th>
        </tr>
    </thead>
    <tbody>
    @foreach($events as $produit)
        <tr>
            <th scope="row">{{ $produit -> idNosEvenements}}</th>
            <td>{{ $produit -> Nom}} </td>
            <td>{{ $produit -> idThematiques }}</td>
            <td>{{ $produit -> lieu }}</td>
            <td>{{ $produit -> Type }}</td>
            <td class="text-center"> {{ $produit -> Programme }} </td>
            <td class="text-center"> {{ $produit -> Objectifs }} </td>                       
        </tr>
    @endforeach
    </tbody>
</table>

Мои маршруты:

// EVENTS
Route::get('/events', 'MesEventsController@index'); // retrieve all events
Route::post('/events/a-proximite', 'MesEventsController@distGeoLoc'); // sort all events near user
Route::post('/events/search', 'MesEventsController@searchEvents'); // filter search for events
Route::get('/events/{zone}', 'MesEventsController@distZone'); // sort all events by area
Route::get('/test/geocode', 'MesEventsController@distGeocode'); // sort all events by geocoding address

Мой контроллер:

public function index() {
    $events = Nosevenement::all();
    return view('events', ['events' => $events]);
}

// SORTING METHODS WITH EVENTS:all() FOR TESTING PURPOSES
// SORTING EVENTS BY AREA / ZONE
public function distZone($zone) {
    switch($zone) {
    case "St-Pierre":
        $latitude = -21.3328174;
        $longitude = 55.4630668;
        break;
    case "St-Paul":
        $latitude = -21.0140263;
        $longitude = 55.2607508;
        break;
    default:
        $latitude = -20.8926767;
        $longitude = 55.4827193;
        break;
    }
    $query = Nosevenement::distance($latitude, $longitude);
    $asc = $query -> orderBy('distance', 'ASC') -> get();
    return view('events', ['events' => $asc], ['zone' => $zone]);
}

Я попытался сериализовать () результаты поиска и поместить их в скрытый затем введите и unserialize () их, но я получил ошибку:

public function distZone($zone, Request $request) {
    // dd($zone, $request);
    if(!empty($request)) {
        $query = unserialize($request);
    }
    switch ($zone) { etc }

unserialize (): ошибка по смещению 0 из 19097 байт

Так что я думаю, что результаты поиска слишком большой. Возможно, мне интересно получить только результаты поиска $ id?

Я не думаю, что у меня достаточно перспективы на данный момент, если у вас есть идеи, которые будут высоко оценены :)

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Я наконец-то заставил его работать как в бэкенде, так и во внешнем интерфейсе (бэкэнд для другого проекта).

Но для внешнего интерфейса мне пришлось внести некоторые изменения, потому что я столкнулся со многими проблемами.

В конце я перебрал все строки, чтобы вычислить расстояние для каждого события, а затем передал его атрибуту данных в HTML.

Затем происходит сортировка с атрибутом данных, и оттуда он добавляется строки к телу.

$('#results tbody tr').each(function() {
    const a_lat = $(this).data('lat');
    const a_lon = $(this).data('lon');
    var a_distance = distance(a_lat, a_lon, latitude, longitude, 'K');
    $(this).attr("data-madist", a_distance);
    console.log(Math.round(a_distance) + "km entre l'évènement et " + zone);
});

const compare_rows = function (a, b) {
    return a.getAttribute('data-madist') - b.getAttribute('data-madist');
};

// Calls the comparison function and then adds the results to the body
$('#results > tbody > .sortable').sort(compare_rows).appendTo('#results tbody');

Еще раз спасибо за JS образцов;)

0 голосов
/ 08 апреля 2020

Ваш вопрос только о сортировке, верно? не делать более точный фильтр?

Если вы хотите сериализовать параметры вашего запроса, вы должны использовать ->all() (экспортировать все параметры в массив):

// Serialize parameters to append them into hidden input
// <input type="hidden" name="s" value="{{ $s }}">
$s = serialize($request->all());

// Unserialize after
$params = unserialize($request->s);

Если вы только хочет сделать сортировку, вы можете сделать это легко с Javascript прямо в вашем представлении. Это будет более эффективным и не будет перегружать сервер простых задач сортировки.

Я рекомендую вам использовать jQuery на стороне клиента. Вы можете добавить свои координаты в качестве атрибута данных для ваших строк:

<a class="stpierre" href="javascript:sortDistZone(-21.3328174, 55.4630668)">Saint-Pierre</a>

<table id="results" class="table table-bordered table-striped">
    <thead class="text-center thead-dark">
        <tr>
            <th scope="col">ID</th>
            <th scope="col">Nom</th>
            <th scope="col">Thématique</th>
            <th scope="col">Lieu</th>
            <th scope="col">Type</th>
            <th scope="col">Programme</th>
            <th scope="col">Objectif</th>
        </tr>
    </thead>
    <tbody>
    @foreach($events as $produit)
        <tr data-lat="{{ $produit->latitude }}" data-lon="{{ $produit->longitude }}">
            <th scope="row">{{ $produit -> idNosEvenements}}</th>
            <td>{{ $produit -> Nom}} </td>
            <td>{{ $produit -> idThematiques }}</td>
            <td>{{ $produit -> lieu }}</td>
            <td>{{ $produit -> Type }}</td>
            <td class="text-center"> {{ $produit -> Programme }} </td>
            <td class="text-center"> {{ $produit -> Objectifs }} </td>                       
        </tr>
    @endforeach
    </tbody>
</table>
<script type="text/javascript">
distance(lat1, lon1, lat2, lon2) {
    return ... your distance function here ...;
}

sortDistZone(latitude, longitude) {
    // A simple compare function, used by the sort below
    const compare_rows = function (a, b) {
        const a_lat = $(a).data('lat');
        const a_lon = $(a).data('lon');
        const a_distance = distance(a_lat, a_lon, latitude, longitude);

        const b_lat = $(b).data('lat');
        const b_lon = $(b).data('lon');
        const b_distance = distance(a_lat, a_lon, latitude, longitude);

        if (a_distance>b_distance){
            return 1;
        }
        if (a_distance<b_distance){
            return -1;
        }
        return 0;
    };

    // the actual sort
    $('#results tr').sort(compare_rows).appendTo('#results tbody');
}
</script>

Приятного мужества !! :)

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