Laravel 4 — Как вставить несколько моделей?

#php #mysql #laravel #laravel-4

#php #mysql #laravel #laravel-4

Вопрос:

Я пытаюсь вставить несколько моделей в базу данных, но безуспешно… У меня есть форма (лезвие) выглядит следующим образом:

 @extends('layouts.properties')

@section('content')

{{ Form::open(['route' => 'properties.store', 'class' => 'uk-form', 'id' => 'properties-form']) }}

@for ($i = 0; $i < Auth::user()->properties_count; $i  )

<fieldset class="uk-margin-large-top property-field-{{ $i   1 }}">

{{ Form::select('boro[]', ['Pick Borough', 'Manhattan', 'Bronx', 'Brooklyn', 'Queens', 'Staten Island']) }}

{{ Form::text('house_num[]', Input::old('house_num'), ['class' => 'uk-form-width-small', 'placeholder' => 'House Num']) }}

{{ Form::text('street[]', Input::old('street'), ['placeholder' => 'Street']) }}

</fieldset>

@endfor

{{ Form::submit('Save Properties', ['class' => 'uk-button uk-button-primary']) }}

{{ Form::close() }}

@stop
  

В контроллере у меня есть: (используется array_filter для очистки неустановленных значений, если пользователь заполнил только 2 свойства)

 $boro = array_filter(Input::get('boro'));
$house_num = array_filter(Input::get('house_num'));
$street = array_filter(Input::get('street'));
  

Теперь я застрял … не могу понять, как перебирать 3 массива и сохранять их в нескольких моделях (строках).

Примечание: В моей пользовательской модели я установил отношение свойств hasMany.

Моя модель свойств выглядит следующим образом: id user_id boro housenum street

Итак, если в массивах у меня есть 2 адреса, мне нужны строки.

Есть идеи?

Комментарии:

1. Я не совсем понимаю вашу проблему. Можете ли вы указать, как выглядит ваша модель и какие данные вы хотите вставить?

2. Я отредактировал исходное сообщение, надеюсь, теперь все ясно…

3. Пожалуйста, будьте БОЛЕЕ конкретны с вашей моделью, сохраненные значения являются каким-то отношением? и без обид, но код немного нечитаемый. Так в чем именно проблема?

4. Я не знаю, насколько более понятным я могу быть…

Ответ №1:

 // Get your input values
$boros = Input::get('boro');
$numbers = Input::get('house_num');
$streets = Input::get('street');

// Iterate through the arrays
$models = array();
$total = count($boros);
for( $c=0; $c < $total; $c   ) {
  $models[] = array('boro' => $boros[$c], 'numbers' => $numbers[$c], 'street' => $streets[$c]);
}

// Insert all the models
DB::table('whatever')->insert($models);
  

Ответ №2:

 $boros = Input::get('boro');
$streets = Input::get('street');
$numbers = Input::get('house_num');

$properties = [];

foreach ($boros as $key => $boro)
{
   $properties[] = [
     'boro' => $boro, 
     'street' => $streets[$key], 
     'housenum' => $numbers[$key],
     'user_id' => $userId   // probably needed too
   ]
}

// cleaning (and validation maybe?)
$properties = array_map(function ($property) {
    return array_filter($property);
}, $properties);


DB::table('properties')->insert($properties);