Sylar
Sylar

Reputation: 12082

Laravel 5 Relationship Not Working?

In my app I have few models: User and Profile. The User model is only for companies, my app is for companies only. When a user registers, they only fill in their name, email address and password. My Profile model has columns for company name, address etc. My profile form does not work; not saving to the database. Here is the setup:

Controller for the form:

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');
}

The Form:

{!! 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() !!}

Have I set the relationship correct? Nothing is saving to the database.

Upvotes: 0

Views: 927

Answers (3)

Gabriel Sigouin
Gabriel Sigouin

Reputation: 261

In Laravel 5 when you want to chain with relation, you need for exemple (Post with comment related) use the method from your comment.

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

Docs from Laravel:

If you need to add further constraints to which comments are retrieved, you may call the comments method and continue chaining conditions:

$comments = Post::find(1)->comments()->where('title', '=', 'foo')->first();

Upvotes: 0

Gustavo Gama
Gustavo Gama

Reputation: 91

I want to comment but do not have enough reputation :( A few days ago I found a little problem with this approach:

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

In this case the mutators in related model (profile in the example) like this are not invoked (may be a bug):

public function setLoremIpsumAttribute($attr)
{
    # code
}

In controller I tried another approach and it worked:

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

Upvotes: 0

Martin Bean
Martin Bean

Reputation: 39389

You’re updating the user model and the user model only. You need to also set the attributes in the profile relation:

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

Your controller action could also be tidied up a bit, by using route–model binding to inject your User model instance, and also use the service container to provide a Request instance too so you’re not using the Input façade:

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('/');
}

Upvotes: 1

Related Questions