Laravel 5.8 Dynami c Зависит от выбора - PullRequest
0 голосов
/ 11 апреля 2020

Я хочу получить подкатегории текущей категории, используя JQuery Ajax для создания сообщений. Это не работает для меня, но когда я изменяю URL в браузере, как это http://127.0.0.1: 8000 / back / posts / create / json -subcategories? Category_id = 1 , это приводит все подкатегории в массив

вот пример изображения

Страница маршрута:


Route::get('/posts/create', ['uses'=>'Admin\PostController@create','as'=>'post-create', 'middleware'=> 'permission:Post List|All'] );

Route::get('/posts/create/json-subcategories', ['uses'=>'Admin\PostController@subcategories','as'=>'post-create', 'middleware'=> 'permission:Post List|All'] );

PostController:


 public function create()
    {
         $page_name = 'Create Post';
        $categories = Category::where('status',1)->pluck('name','id'); 
        return view('admin.post.create',compact('page_name','categories'));
    }



public function subcategories()
    {

       $category_id = Input::get('category_id');
      $subcategories = Subcategory::where('category_id', '=', $category_id)->get();
      return response()->json($subcategories);
    }

create.blade. php


<div class="form-group">
            <label for="">Your Category</label>
            <select class="form-control" name="categories" id="categories">
              <option value="0" disable="true" selected="true">=== Select Category ===</option>
                @foreach ($categories as $key => $value)
                  <option value="{{$value}}">{{ $value }}</option>
                @endforeach
            </select>
          </div>



          <div class="form-group">
            <label for="">Your Subcategory</label>
            <select class="form-control" name="subcategories" id="subcategories">
              <option value="0" disable="true" selected="true">=== Select Subcategory ===</option>
            </select>
          </div>



<script src="{{asset('js/jquery.js')}}"></script>
<script type="text/javascript">

$('#categories').on('change', function(e){
        console.log(e);

  var category_id = e.target.value;
        $.get('/posts/create/json-subcategories?category_id=' + category_id,function(data) {
          console.log(data);
      $('#subcategories').empty();
          $('#subcategories').append('<option value="0" disable="true" selected="true">=== Select Subcategory ===</option>');

$.each(data, function(index, subcategoriesObj){
            $('#subcategories').append('<option value="'+ subcategoriesObj.id +'">'+ subcategoriesObj.name +'</option>');
          })

    });

  });

</script>


1 Ответ

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

Почему ваш пример URL имеет префикс /back? Потому что ваш файл маршрута не показывает это поведение. Возможно, ошибка заключается в том, чтобы найти в этой конструкции, но есть и другая причина.

Для меня ваша проблема выглядит так, как будто вы неправильно настраиваете свои ключи. Метод pluck() в коллекции возвращает все значения данного ключа, как описано здесь:
https://laravel.com/docs/5.8/collections#method -pluck

Поскольку вы передаете ключ id как в методе pluck все значения клавиши name будут введены со значением соответствующей id записи.

Таким образом, ваше представление должно выглядеть примерно так (не проверено):

...
<select class="form-control" name="categories" id="categories">
    <option value="0" disable="true" selected="true">=== Select Category ===</option> 
         @foreach ($categories as $key => $value)
             // changed the value of the value-attribute to the key of the passed collection
             <option value="{{$key}}">{{ $value }}</option>
         @endforeach
</select>
...

НО :
, поскольку я предполагаю, что ваша subcategory -антия используется не только для вашей category, но скорее в основном независимая сущность, возможно, Вы можете подумать об этих следующих моментах:

  • Вы также можете использовать функцию ресурса Laravels.
    https://laravel.com/docs/5.8/controllers#resource -контроллеры

  • маршрут для получения subcategory, даже для указанного c родительского ключа, не должен находиться в пределах маршрута создания вашей категории. Это независимая таблица и тип данных, поэтому вы можете задать ему маршрут, например:

Route::get('/category/subcategories/{category}', 'CategoryContoller@getSubcategories');

Как вы можете видеть в предыдущем примере, я добавил параметр маршрута (https://laravel.com/docs/5.8/routing#route -параметры ), что дает вам возможность вызывать модель непосредственно из маршрута. Можно также сказать, что этот запрос связан с сущностью subcategory, поэтому он будет обработан в пределах SubcategoryController. Но хотя это всегда вопрос личных предпочтений, для меня более правдоподобно использовать его таким образом, потому что позже мы получим подкатегории из самой категории. И поэтому мы будем вызывать и обрабатывать category -модель в своем собственном контроллере, который мне удобнее.

Чтобы использовать этот подход, вы должны изменить / добавить 2 вещи:

public function boot()
{
    parent::boot(); // kept this line if its there, add it if not

    Route::model('category', App\Category::class); // add this new line
}
  • Добавьте связи с вашими моделями:
# Category
public function subcategories() {
    $this->hasMany(App\Subcategory::class);
}
# Subcatgory
public function category() {
    $this->belongsTo(App\Category::class);
}

После этого вы можете сделать в вас следующее CategoryController:

#CategoryController
// the $category model variable is automatically injected and is a retrieved dataset from your database
public function getSubcategories(Category $category) { 

    $subcategories = $category->subcategories();

    return response()->json($subcategories->toArray());
}


Hope this can help a bit.



...