Search code examples
phplaravellaravel-bladelaravel-5.3

Insert into two tables that are in one to one relationslip laravel


I have 2 tables that are in one to one relationship:

tours :

id|title|content

featured_image:

id|tour_id|name|path

My models FeaturedImage.php:

class FeaturedImage extends Model
{
public function tour()
 {
    return $this->hasOne('App\Tour');
 }
}

Tour.php

class Tour extends Model
{
  public function featuredimage()
  {
    return $this->belongsTo('App\FeaturedImage');
  }
}

I want to save tour_id in featured_image table when tour is created. I'm using same form to fill tours table and to upload featured_image.

This is my store method looks like:

    public function store(Request $request)
{

    //validate the date
    $this->validate($request, [
            'title'    => 'required|max:255',
            'content'  => 'required'
        ]);
    //store the date
    $tour = new Tour;

    $tour->title   = $request->title;
    $tour->content = $request->trip_code;

    $tour->save();

    $featured_image= new FeaturedImage;
    // save featured_image
    if($request->hasFile('featured_image')){
        $image = $request->file('featured_image');
        $filename = $image->getClientOriginalName();
        $location = public_path('images/featured_image/'.$filename);
        Image::make($image)->resize(800, 600)->save($location);

     $featured_image->path= $location;
     $featured_image->tour()->associate($tour);
     $featured_image->save();
    }

    //redirect to 
    Session::flash('success','Tour is successfully created !');
    return redirect()->route('tours.show',$tour->id);
}

I'm successful to save data into tours table but unable to save in featured_image table. I 'm getting this error:

Call to undefined method Illuminate\Database\Query\Builder::associate()

I would be thankful if anyone can help me out.


Solution

  • You can user Mass Assignment to create your entries into DB like this:

    $this->validate(request()->all(), [
        'title'    => 'required|max:255',
        'content'  => 'required'
    ]);
    
    $tour_inputs = array_only(
        $tour_inputs.
        [
            'title',
            'content',
        ]
    );
    
    $tour = Tour::create($tour_inputs);
    
    if($request->hasFile('featured_image')) {
        $image = $request->file('featured_image');
        $filename = $image->getClientOriginalName();
        $location = public_path('images/featured_image/'.$filename);
        Image::make($image)->resize(800, 600)->save($location);
    
        $featuredImage = $tour->featuredImage()->save(new FeaturedImage([
            'name' => $filename,
            'path' => $location,
        ]));
    }
    

    Remember to define the $fillables inside your models, your models should look like this,

    do check your relations, that you've made in the models, according to me they aren't correct:

    class Tour extends Model
    {
        protected $fillables = [
            'title',
            'content',
        ];
    
        public function featuredImage()
        {
          return $this->hasOne('App\FeaturedImage');
        }
    }
    
    
    class FeaturedImage extends Model
    {
        protected $fillables = [
            'name',
            'path',
            'tour_id',
        ];
    
        public function tour()
        {
          return $this->belongsTo('App\Tour');
        }
    }
    

    Hope this helps!