Laravel помещает массив в поле выбора

Я столкнулся с некоторыми проблемами с моим полем выбора, где я поместил все доступные категории в

В моем контроллере я использую этот фрагмент:

 return View::make("stories.add")
        ->with("title","Indsend novelle")
        ->with("categories", Category::all());

На мой взгляд, я пытаюсь поместить все категории в поле выбора следующим образом:

 {{Form::select("category", $categories)}}

Я мог бы сделать это, но это не сработает, потому что Form::select должен быть массивом?

@foreach ( $categories as $category )
    {{$category->name}}
@endforeach

Что делать?

Я сделал это, и это работает, но выглядит слишком уродливо и неудобно для пользователя, какие-либо предложения?

  $test = Category::all(); $myArray = array();
    foreach ( $test as $o):
          $myArray[] = $o->name;
    endforeach;

    return View::make("stories.add")
        ->with("title","Indsend novelle")
        ->with("categories", $myArray);

var_dump:

    array(2) {
      [0]=>
      object(Category)#36 (5) {
        ["attributes"]=>
array(4) {
  ["id"]=>
  string(1) "1"
  ["name"]=>
  string(12) "Alderforskel"
  ["created_at"]=>
  string(19) "0000-00-00 00:00:00"
  ["updated_at"]=>
  string(19) "0000-00-00 00:00:00"
}
["original"]=>
array(4) {
  ["id"]=>
  string(1) "1"
  ["name"]=>
  string(12) "Alderforskel"
  ["created_at"]=>
  string(19) "0000-00-00 00:00:00"
  ["updated_at"]=>
  string(19) "0000-00-00 00:00:00"
}
["relationships"]=>
array(0) {
}
["exists"]=>
bool(true)
["includes"]=>
array(0) {
}
}
       [1]=>
   object(Category)#39 (5) {
  ["attributes"]=>
  array(4) {
  ["id"]=>
  string(1) "2"
  ["name"]=>
  string(7) "Bondage"
  ["created_at"]=>
  string(19) "0000-00-00 00:00:00"
  ["updated_at"]=>
  string(19) "0000-00-00 00:00:00"
}
["original"]=>
 array(4) {
  ["id"]=>
  string(1) "2"
  ["name"]=>
  string(7) "Bondage"
  ["created_at"]=>
  string(19) "0000-00-00 00:00:00"
  ["updated_at"]=>
  string(19) "0000-00-00 00:00:00"
}
["relationships"]=>
array(0) {
}
["exists"]=>
bool(true)
["includes"]=>
array(0) {
}
}
}

person kim larsen    schedule 18.06.2013    source источник
comment
Вы используете Laravel 3 или Laravel 4? Вам нужно только пометить это одним.   -  person Bailey Parker    schedule 18.06.2013
comment
В laravel 4 вы должны иметь возможность использовать Category::all()-›all() для преобразования Collection в массив.   -  person Bailey Parker    schedule 18.06.2013
comment
Вызов функции-члена all() для не-объекта   -  person kim larsen    schedule 18.06.2013
comment
Сделайте var_dump(Category:all());. Я подозреваю, что он возвращает массив.   -  person Bailey Parker    schedule 18.06.2013


Ответы (4)


Что вам нужно сделать, так это дать Form::select() массив имен категорий и их идентификаторов. Если вы перебираете категории, вы можете объединить их, а затем передать их в Form::select().

$categories = Categories::all();
$selectCategories = array();

foreach($categories as $category) {
    $selectedCategories[$category->id] = $category->name;
}

return View::make("stories.add")
        ->with("title","Indsend novelle")
        ->with("categories", $selectCategories);
person Bailey Parker    schedule 18.06.2013
comment
Говорит, что плака не существует. - person kim larsen; 18.06.2013

Используйте это следующим образом:

$categories = Category::pluck('name', 'id');

return View::make('....', compact('categories'));

А теперь в представлении:

{{ Form::select('selectName', $categories, null); }}

Изменить: найдено в документах Конструктор запросов # Выберите Посмотрите на это

person Israel Ortuño    schedule 18.06.2013
comment
Эй, ты уверен, что Category::lists('name', 'id'); это действительно? Я не знаю о функции lists в построителе запросов или модели. - person Shreyansh Panchal; 14.11.2019
comment
Функция lists устарела и заменена на pluck() начиная с Laravel › 5.2 Теперь вы можете сделать Category::pluck('name', 'id'); - person Shreyansh Panchal; 14.11.2019

Что вам нужно сделать, так это вместо использования функции with() с представлением, помещенным внутри функции контроллера.

$categories = Category::all();

После этого вам нужно правильно восстановить массив:

$category = array();
foreach($categories as $cat)
{
  $category[]['id'] = $cat->attributes['id'];
  $category[]['name'] = $cat->attributes['name'];
}

теперь в View::make()

return View::make("stories.add",array('title'=> "Indsend novelle","categories", $category));

Я надеюсь, что это может помочь.

person saran banerjee    schedule 18.06.2013
comment
Не работает. Если более 1 категории, вместо имени отображается ID, где имя должно быть в ‹option ..› т.е. ‹select name=category›‹option value=id›2‹/option›‹option value=name›Bondage‹/option›‹/select› - person kim larsen; 18.06.2013
comment
извините, ким, моя ошибка, я внес изменения в цикл foreach, пожалуйста, внесите эти изменения в свой сценарий, и я надеюсь, что это поможет. - person saran banerjee; 18.06.2013

Мне нравится подход, предложенный Исраэлем Ортуньо

Я бы только добавил небольшую модификацию, чтобы выбор начинался с пустой опции "Выбрать из списка" по умолчанию.

$categories = array(0=>'Choose from the list') + Category::lists('name', 'id');

return View::make('....', compact('categories'));


Теперь раскрывающийся список выглядит так:

<option value="0">Choose from the list</option>
<option value="{whatever-the-category-id}">Category 1</option>
...
person Nat Naydenova    schedule 07.01.2015