Страна и штат динамического раскрывающегося списка Laravel

Я пытаюсь сделать два выпадающих меню. Это выборы стран и штатов из моей базы данных. Моя проблема в том, что я не знаю, как поставить условия, при которых государства должны быть зависимы от стран. Когда я выбираю [название страны], в моем раскрывающемся списке отображается другое название штата. Итак, вот что я сделал до сих пор.

AdminController.php

public function user_register()
    {
        $countryname = DB::table('countries')
            ->get();
        $statename = DB::table('states')
            ->get();

        $title = ucwords(Lang::get('constants.user') . ' ' . Lang::get('constants.register')); 
        return View::make('register.user_register')
            ->with('title', $title)
            ->with('page', 'user_register')
            ->with('countryname', $countryname)
            ->with('statename', $statename)
    }

user_register.blade.php

<select class="form-control" id="countries" name="countries">
    <option value="">Please select</option>
        <?php foreach ($countryname as $key=>$countryname): ?>
        <option value="<?php echo $countryname->sortname; ?>"<?php
         if (isset($countries) && Input::old('countries') == $countryname->sortname) 
         {
             echo 'selected="selected"';
         }
         ?>>
         <?php  echo $countryname->sortname ." - ". $countryname->name  ; ?>
    </option>
    <?php endforeach; ?>
</select>


<select class="form-control" id="states" name="states">
    <option value="">Please select</option>
        <?php foreach ($statename as $key=>$statename): ?>
        <option value="<?php echo $countryname->name; ?>" <?php
        if (isset($states) && Input::old('states') == $statename->name)
        {
            echo 'selected="selected"';
        }
        ?>>
        <?php  echo $statename->name; ?></option>
        <?php endforeach; ?>
</select>

В моей базе данных

Таблица: страны

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| country_id| int(11)      | NO   | PRI | NULL    | auto_increment |
| sortname  | varchar(3)   | NO   |     | NULL    |                |
| name      | varchar(150) | NO   |     | NULL    |                |
| phonecode | int(11)      | NO   |     | NULL    |                |
+-----------+--------------+------+-----+---------+----------------+

Таблица: состояния

+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255)     | NO   |     | NULL    |                |
| country_id | int(11)          | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+

person Kevin    schedule 12.07.2017    source источник
comment
Вы хотите обновлять штаты при выборе страны (чтобы отображались только штаты, относящиеся к этой стране)? Если да, вам понадобится javascript.   -  person tompec    schedule 12.07.2017
comment
Это нужно делать с помощью javascript. Передайте данные о стране / штате в качестве переменной и измените состояние с помощью onChange () в выбранной стране.   -  person aynber    schedule 12.07.2017
comment
Кроме того, если вы используете лезвие, не используйте <?php if (..., просто используйте @if (.... См. Документ laravel.com/docs/5.4/blade   -  person tompec    schedule 12.07.2017
comment
@tompec (чтобы показать только штаты, относящиеся к этой стране) Да, сэр, именно я хотел бы сделать его динамическим раскрывающимся списком (при изменении). Вы можете помочь мне, сэр, как я буду кодировать? :( Также правильный способ кодирования вместо тегов html, например: ‹? ​​Php if ....   -  person Kevin    schedule 12.07.2017
comment
Да, сэр @aynber, спасибо за ответ. У меня проблема, как я буду кодировать ... :( в laravel   -  person Kevin    schedule 12.07.2017
comment
Хорошо, дайте мне несколько минут, я напишу вам, как это сделать.   -  person tompec    schedule 12.07.2017
comment
Некоторое время я использовал bootstrap formhelper, который может делать то, что вам нужно.   -  person aynber    schedule 12.07.2017
comment
@tompec, большое спасибо, сэр!   -  person Kevin    schedule 12.07.2017


Ответы (2)


Вот как сделать динамическое раскрывающееся меню в Laravel:

Вы можете увидеть демонстрацию того, как это работает, здесь https://www.dronejobs.co/

Отказ от ответственности: я не тестировал это, но это должно работать. Не стесняйтесь комментировать, я обновлю ????

приложение / HTTP / Контроллеры / HomeController.php

<?php

namespace App\Http\Controllers;

use App\{Country, State};

class HomeController extends Controller
{
    public function index()
    {
        return view('home', [
            'countries' => Country::all(),
            'states' => State::all(),
        ]);
    }
}

ресурсы / просмотры / home.blade.php

<select name="country">
    @foreach ($countries as $country)
        <option value="{{ $country->id }}">{{ $country->name }}</option>
    @endforeach
</select>

<select name=“state”>
    @foreach ($states as $state)
        <option value="{{ $state->id }}">{{ $state->name }}</option>
    @endforeach
</select>

<script>
    $(function() {
        $('select[name=country]').change(function() {

            var url = '{{ url('country') }}' + $(this).val() + '/states/';

            $.get(url, function(data) {
                var select = $('form select[name= state]');

                select.empty();

                $.each(data,function(key, value) {
                    select.append('<option value=' + value.id + '>' + value.name + '</option>');
                });
            });
        });
    });
</script>

приложение / Country.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Country extends Model
{   
    public function states()
    {
        return $this->hasMany('App\State');
    }

приложение / State.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

Class State extends Model
{   
    public function country()
    {
        return $this->belongsTo('App\Country');
    }

маршруты / web.php

Route::get('country/{country}/states', 'CountryController@getStates');

приложение / HTTP / Контроллеры / CountryController.php

<?php

namespace App\Http\Controllers;

use App\Country;

class CountryController extends Controller
{
    public function getStates(Country $country)
    {
        return $country->states()->select('id', 'name')->get();
    }
}
person tompec    schedule 12.07.2017
comment
Пожалуйста, дайте мне знать, что это работает, и отметьте вопрос как решенный, если это так;) - person tompec; 12.07.2017
comment
есть ли более короткий метод получения данных из базы данных и передачи их в раскрывающихся списках? например: $ countryname = DB :: table ('countries') - ›get (); . Затем добавить несколько кодов js для параметра (условие onchange)? - person Kevin; 13.07.2017

Я хочу обновить этот пост, я уже решил свою проблему. Я просто хочу поделиться этими решениями с сообществом :)

Я только что добавил для этого несколько кодов ajax в свой user_register.blade.php:

<div class="form-group">
    <label for="title">Select Country:</label>
    <select name="country" class="form-control">
        <option value="">--- Select country ---</option>
        @foreach ($countries as $key => $value)
            <option value="{{ $value }}">{{ $value }}</option>
        @endforeach
    </select>
</div>
<div class="form-group">
    <label for="title">Select state:</label>
    <select name="state" class="form-control">
    </select>
</div>
<script type="text/javascript">
$(document).ready(function() {
$('select[name="country"]').on('change', function() {
    var countryID = $(this).val();
        if(countryID) {
        $.ajax({
            url: '/admin/user_register/ajax/'+encodeURI(countryID),
            type: "GET",
            dataType: "json",
            success:function(data) {
            $('select[name="state"]').empty();
            $.each(data, function(key, value) {
                $('select[name="state"]').append('<option value="'+ value +'">'+ value +'</option>');
                });
            }
        });
        }else{
        $('select[name="state"]').empty();
          }
       });
    });
</script>

Который я указал, где взять данные на основе идентификатора страны и передать его в мой routes.php:

url: '/admin/user_register/ajax/'+encodeURI(countryID),

В моем routes.php:

    //dynamic dropdown country and states
Route::get('/admin/user_register/ajax/{country_id}',array('as'=>'user_register.ajax','uses'=>'AdminController@stateForCountryAjax'));

В последний раз я добавил несколько кодов в свой AdminController.php, что делать:

public function stateForCountryAjax($country_name)
{
    $country_name = urldecode($country_name);
    $country_id = $this->_stateCountryIDForCountryName($country_name);
    $states = DB::table("states")
                ->where("country_id",$country_id)
                ->lists('name','id');
    return json_encode($states);
}

private function _stateCountryIDForCountryName($country_name)
{
    return DB::table('countries')->where("name","$country_name")->first()->country_id;
}

У меня этот метод работает. Теперь я смог динамически обновлять раскрывающийся список (состояния) на основе идентификатора страны.

person Kevin    schedule 14.08.2017