0

Laravel 4のリソースコントローラーで、リダイレクトまたはindex()メソッド/アクションに似たものを使用して、複数の複数選択値を送信する方法を見つけようとしています.

私はこれを達成するためにいくつかの試みをしましたが、まだそれを行う方法を考え出していません.

最初はクエリ文字列に送信しましたが、これはある程度機能しましたが、単一の複数選択ボックスで複数の値を選択するとすぐに、最後の値を使用することを選択したため、機能しませんでした。

これは、いくつかの複数選択ボックスを備えた、私の見解のフォームです。http://paste.laravel.com/s1n

現時点では、postSearch() という EventsController のアクション/メソッドに投稿しています。http://paste.laravel.com/s1pこのメソッドは次に、私の index() メソッドにリダイレクトし、$search_data 変数を取り、http://paste を使用して Eloquent モデルから結果を選択するために使用することになっています。 laravel.com/s1q

これを機能させるためにいくつかのことを試してきたので、これらの方法は現時点では少し混乱しています。

誰かがこれに関するガイダンスを提供できれば、本当に感謝しています。ありがとう。

4

1 に答える 1

1

わかりました、これを行う方法を考え出しました。これは最善または最も洗練されたソリューションではないかもしれませんが、機能し、後でリファクタリングできます。

私の見解では、まずフォームです。

{{ Form::open(array('action' => 'EventsController@postSearch', 'method' => 'POST', 'class' => 'view-only pull-left form-inline')) }}
    {{ Form::label('courses', 'Course', array('class' => 'label')) }}
    {{ Form::select('courses[]', $courses, '', array('class' => 'input-medium field', 'multiple' => 'multiple')) }}
    {{ Form::label('suppliers', 'Supplier', array('class' => 'label')) }}
    {{ Form::select('suppliers[]', $suppliers, '', array('class' => 'input-medium field', 'multiple' => 'multiple')) }}
    {{ Form::label('locations', 'Location', array('class' => 'label')) }}
    {{ Form::select('locations[]', $locations, '', array('class' => 'input-medium field', 'multiple' => 'multiple')) }}
    {{ Form::label('venues', 'Venue', array('class' => 'label')) }}
    {{ Form::select('venues[]', $venues, '', array('class' => 'input-medium field', 'multiple' => 'multiple')) }}
    {{ Form::label('event_statuses', 'Status', array('class' => 'label')) }}
    {{ Form::select('event_statuses[]', $event_statuses, '', array('class' => 'input-medium field', 'multiple' => 'multiple')) }}
    {{ Form::submit('Search', array('class' => 'btn btn-success')) }}
{{ Form::close() }}

そして、EventsController の洗練された postSearch メソッド:

public static function postSearch()
{
    $courses_value = Input::get('courses');
    $suppliers_value = Input::get('suppliers');
    $locations_value = Input::get('locations');
    $venues_value = Input::get('venues');
    $status_value = Input::get('event_statuses');
    // $tutor_value = Input::get('tutors');

    $search_data = array(
        'courses_value'         => $courses_value,
        'suppliers_value'       => $suppliers_value,
        'locations_value'       => $locations_value,
        'venues_value'          => $venues_value,
        'status_value'          => $status_value,
        // 'tutor_value'           => $tutor_value
    );

    return Redirect::to('events')->with($search_data);
}

次に、私の index メソッドには次のものが含まれます。

    $courses_value = Session::get('courses_value');
    $suppliers_value = Session::get('suppliers_value');
    $locations_value = Session::get('locations_value');
    $venues_value = Session::get('venues_value');
    $status_value = Session::get('status_value');
    // $tutor_value = Session::get('tutor_value');

    if (is_null($courses_value)) {
        $courses = Course::all();

        $course_titles = array();

        foreach ($courses as $course) {
            $course_titles[] = $course->title;
        }

        $courses_value = $course_titles;
    }

    if (is_null($suppliers_value)) {
        $suppliers = Supplier::all();

        $supplier_names = array();

        foreach ($suppliers as $supplier) {
            $supplier_names[] = $supplier->name;
        }

        $suppliers_value = $supplier_names;
    }

    if (is_null($locations_value)) {
        $locations = Location::all();

        $location_cities = array();

        foreach ($locations as $location) {
            $location_cities[] = $location->city;
        }

        $locations_value = $location_cities;
    }

    if (is_null($venues_value)) {
        $venues = Venue::all();

        $venue_names = array();

        foreach ($venues as $venue) {
            $venue_names[] = $venue->name;
        }

        $venues_value = $venue_names;
    }

    if (is_null($status_value)) {
        $event_statuses = EventStatus::all();

        $statuses = array();

        foreach ($event_statuses as $event_status) {
            $statuses[] = $event_status->status;
        }

        $status_value = $statuses;
    }

これはおそらくリファクタリングでできることです。とにかく、次を使用して結果を選択すると:

$events = Event::where('active', '=', 1)
    ->leftJoin('courses', 'courses.id', '=', 'events.course_id')
    ->leftJoin('suppliers', 'suppliers.id', '=', 'events.supplier_id')
    ->leftJoin('locations', 'locations.id', '=', 'events.location_id')
    ->leftJoin('venues', 'venues.id', '=', 'events.venue_id')
    ->leftJoin('event_types', 'event_types.id', '=', 'events.event_type_id')
    ->leftJoin('event_statuses', 'event_statuses.id', '=', 'events.event_status_id')
    ->leftJoin('tutors', 'tutors.id', '=', 'events.tutor_id')
    ->orderBy($order[0], $order[1])
    ->select(array('events.*', DB::raw('events.id as eid'), DB::raw('suppliers.name as sname'), DB::raw('locations.city as lcity'), DB::raw('venues.name as vname'), DB::raw('venues.city as vcity'), DB::raw('tutors.first_name as tfirst_name')))
    ->whereIn('courses.title', $courses_value)
    ->whereIn('suppliers.name', $suppliers_value)
    ->whereIn('locations.city', $locations_value)
    ->whereIn('venues.name', $venues_value)
    ->whereIn('event_statuses.status', $status_value)
    // ->whereIn('tutors.first_name', $tutor_value)
    ->paginate($perPage);

複数選択ボックスで 1 つまたは複数の値を選択できるようになり、結果が期待どおりに表示されるようになりました。これはすばらしいことです。

もっと良い方法があると思いますので、ご存知の方がいらっしゃいましたら教えてください。

セッションから取得されない変数に送信データを保存すると、結果にページネーションを使用でき、ユーザーがリフレッシュしたり、離れたり戻ったりする場合に再検索する必要がなくなります。ページ。

于 2013-05-17T09:21:01.413 に答える