Laravel-4 как заполнить поле выбора из базы данных с идентификатором и значением имени

Я хочу заполнить поле выбора clients из моей базы данных в контроллере проектов, поскольку проект будет принадлежать client, но он также принадлежит зарегистрированному пользователю.

Я хочу создать поле выбора, как показано ниже:

<select>
  <option value="$client->client_id">$client->client_name</option>
  <option value="$client->client_id">$client->client_name</option>
</select>

У меня есть это в laravel, который заполняет мое поле выбора именами клиентов, однако атрибут value имеет имя клиента, и я предпочел бы, чтобы у этого был client_id.

То, как я это сделал, выглядит следующим образом:

ProjectController.php

public function create()
{
    //find logged in users clients
     $clients = Auth::user()->clients;
    $client_selector = array();
    foreach($clients as $client) {
    $client_selector[$client->client_name] = $client->client_name;
    }        
        // load the create form (app/views/projects/create.blade.php)
    return View::make('projects.create', array('client_selector' => $client_selector));
}

create.blade.php

{{ Form::open(array('action' => '[email protected]', 'id' => 'createproject')) }}
  <div class="form-group">
 @if(count($client_selector)>0)

   {{ Form::label('select_client', 'Select Client', array('class' => 'awesome'));   }}

   <!-- SELECT IS CREATED HERE -->
   {{Form::select('client', $client_selector, array_values($client_selector)[0])}}

 @endif 

</div>
<div class="form-group">
    {{ Form::label('project_name', 'Project Name') }}
    {{ Form::text('project_name', Input::old('project_name'), array('class' => 'form-control')) }}

</div>

Как вы можете видеть из того, как создается выбор, он использует имя client_name для заполнения атрибутов значений, и я не очень разбираюсь в эксперте по Laravel, поэтому я не уверен, как изменить эти атрибуты.

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

Спасибо заранее.

Ответ 1

Найден способ сделать это

ClientController.php

public function create() {

  // queries the clients db table, orders by client_name and lists client_name and id
  $client_optons = DB::table('clients')->orderBy('client_name', 'asc')->lists('client_name','id');

    return View::make('projects.create', array('client_options' => $client_options));
}

create.blade.php

// this form is now populated with the value as id and the option names as the client_name
{{ Form::select('clients', $client_options , Input::old('clients')) }}

Надеюсь, что это поможет другим, у кого есть такие проблемы.

Ответ 2

Я тоже подумал об этом и придумал следующее:

В моей модели:

public function scopeSelect($query, $title = 'Select') {
    $selectVals[''] = $title;
    $selectVals += $this->lists('name', 'id');
    return $selectVals;
}

Тогда я могу просто поместить это в свои представления:

{{ Form::select('select_id', Model::Select('Blank option'), '', array()) }}

Ответ 3

Здесь вы можете использовать метод списков. В своем клиентском контроллере выполните

$clients = Client::lists('name', 'id');

И в виду, просто используйте переменную типа,

{{Form::select('client', $clients)}}