2015-04-09 4 views
0

В моем приложении у меня есть несколько моделей: пользователь и профиль. Модель пользователя предназначена только для компаний, мое приложение предназначено только для компаний. Когда пользователь регистрируется, они заполняют только свое имя, адрес электронной почты и пароль. Моя модель имеет столбцы для названия компании, адреса и т. Д. Моя форма профиля не работает; не сохраняя в базе данных. Вот установка:Laravel 5 Отношения не работают?

контроллер для формы:

public function update($company_name) 
{ 
    $user = User::whereCompanyName($company_name)->firstOrFail(); 

     $user->fill(Input::all()); 

     $user->save(); 

     flash('You have successfully edited your profile'); 

     return redirect('/'); 
} 

User.php:

public function profile() 
{ 
    return $this->hasOne('Profile'); 
} 

profile.php:

protected $fillable = ['company_name', 'company_logo', 'company_founded']; 

public function user() 
{ 
    return $this->belongsTo('App\User', 'user_id','ID'); 
} 

Форма:

{!! Form::model($user, array('method' => 'PATCH', 'route' => array('profile.update', $user->company_name), 'files' => true)) !!} 
{!! Form::hidden('user_id', Auth::user()->id) !!} 

    // more fields 

<div class="form-group"> 
    {!! Form::label('company_name', 'Company Name') !!} 
    {!! Form::text('company_name', null, ['class' => 'form-control']) !!} 
</div> 

{!! Form::submit('Update Profile', ['class' => 'btn btn-primary']) !!} 
{!! Form::close() !!} 

ли я установить отношения правильно? В базу данных ничего не сохраняется.

+0

предоставить нам некоторый код из ваш контроллер. – mininoz

+0

@mininoz только что поняли. Он обновляется – Sylar

+1

Также не забудьте изменить 'profile()' внутри User.php: 'return $ this-> hasOne ('App \ Profile');' – JasonK

ответ

1

Вы обновляете модель пользователя и только модель пользователя. Вы должны также установить атрибуты в profile отношении:

$user->update(Input::all()); 
$user->profile->update(Input::all()); 

Ваше действие контроллера также может быть убрано немного, используя route–model binding впрыснуть экземпляр User модели, а также использовать контейнер службы для обеспечения Request экземпляр тоже так вы не используете Input фасад:

public function update(User $user, Request $request) 
{ 
    $user->update($request->all()); 
    $user->profile->update($request->all()); 

    flash('You have successfully updated your profile.'); 

    return redirect('/'); 
} 
+0

Мне нравится ваш путь. Я попробую его с моим контроллером. – mininoz

+0

Im get ''PDOException' с сообщением 'SQLSTATE [HY000]: Общая ошибка: 1 нет такого столбца: _method'' – Sylar

+0

@Sylar Мое предположение - поскольку вы делаете' Input :: all() 'Laravel пытается обновить столбец, соответствующий скрытому полю в форме, называемой '_method'. Вместо этого используйте 'Input :: except()' и передайте массив всех имен ввода формы, которые не должны обновляться _not_. Или вы также можете использовать 'Input :: only()' и указывать имена ввода, которые _must_ должны быть приняты при обновлении. –

0

Я хочу комментировать, но не имею достаточно репутации :(несколько дней назад я нашел немного проблемы с этим подходом:

$user->update(Input::all()); 
$user->profile->update(Input::all()); 

В этом случае мутаторов в соответствующей модели (профиль в примере), как это не вызывается (может быть ошибка):

public function setLoremIpsumAttribute($attr) 
{ 
    # code 
} 

В контроллер я попробовал другой подход и он работал:

$user->update($request->all()); 
$user->profile->fill($request->all()['profile'])->push(); 
0

в Laravel 5, если вы хотите цепи с соотношением, что нужно для Exemple (Post с комментарием, связанной) использовать метод из вашего Commen т.

Post::find(id)->comment()->where(your where statement) 

Docs из Laravel:

Если вам необходимо добавить дополнительные ограничения на какие комментарии извлекаются, вы можете вызвать метод комментариев и продолжить цепные условия:

$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first(); 
Смежные вопросы