2

I get no obvious errors when adding a new job to my database.

My industry job goes into the jobs table but the relationship with divisions in my join table goes nowhere. I just can't see where I'm going wrong

JOIN TABLE

division_industryjob division_id industryjob_id

divisions id division_name

industryjobs id job_title

MODELS

Division.php

<?php 

class Division extends \Eloquent {

    protected $table = 'divisions';

    /**
     * Industry Jobs relationship
     */

    public function industryjobs()
    {
        return $this->belongsToMany('IndustryJob');
    }


}

IndustryJob.php

<?php 

class IndustryJob extends \Eloquent {

    protected $table = 'industryjobs';


     public function divisions()
    {
        return $this->belongsToMany('Division');
    }


}

ROUTES

Route::get('industry-jobs/add', 'AdminController@getCreateIndustryJob');
Route::post('industry-jobs/add', 'AdminController@postCreateIndustryJob')

CONTROLLER

// Create Industry - Get (empty form - new entry)
    public function getCreateIndustryJob()
    {

        View::share('page_title', 'Create a new Industry Job Role');
        View::share('sub_page_title', 'Ex: Mechanical Technician');
        return View::make('admin/industry-jobs/create');
    }

    // Create Industry - Post 
    public function postCreateIndustryJob()
    {

        //validate user input
        $rules = array(
                'job_title' => 'Required|Min:3|Max:80'
        );

        $validation = Validator::make(Input::all(), $rules);

        If ($validation->fails())
        {
            return Redirect::to('/admin/industry-jobs/add')->withErrors($validation);
        } else {


        $industryjob = new IndustryJob;

        $industryjob->job_title = Input::get('job_title');
        $industryjob->job_description    = Input::get('job_description');
        $industryjob->job_qualifications    = Input::get('job_qualifications');

        if (isset($input['divisions'])) {
                foreach ($input['divisions'] as $divId) {
                    $div = Division::find($divId);
                    $industryjob->divisions()->save($div);
                }
            }


        $industryjob->save();

        return Redirect::to('/admin/industry-jobs')->with('message', 'Industry Job created successfully');

        }
    }

FORM

<form class="form-horizontal" method="post" autocomplete="off">

         <!-- Industry Job Title  -->
                <div class="form-group">
                    <label class="col-md-2 control-label" for="industry_name">Industry Job Title (*)</label>

                <div class="col-md-10">
                        <input class="form-control" type="text" name="job_title" id="job_title" value="" />
                    </div>
                </div>
         <!-- ./ Industry Job Title -->


         <!-- Industry Type  -->
           <div class="form-group">
           <label class="col-md-2 control-label" for="body">Related Division</label>
            <div class="col-md-10">
            <select name="divisions[]" id="divisions" size="6" class="form-control" multiple>
                @foreach (Division::all() as $division)
                    <option value="{{ $division->id }}" >{{ $division->division_name }}</option>
                @endforeach
            </select>
            </div>
        </div>
        <!-- ./ Industry Type -->



        <!-- Form Actions -->
        <div class="form-group">
            <div class="col-md-offset-2 col-md-10">
                <button type="reset" class="btn btn-default">Reset</button>
                <button type="submit" class="btn btn-success">Create Job</button>
            </div>
        </div>
        <!-- ./ form actions -->

    </form>
user3189734
  • 665
  • 1
  • 9
  • 27

1 Answers1

3

You are saving the Parent model afterwards so it's not working. Save the Parent model before you save the Child Model, so it should be something like this:

$industryjob = new IndustryJob;
$industryjob->job_title = Input::get('job_title');
$industryjob->job_description    = Input::get('job_description');
$industryjob->job_qualifications    = Input::get('job_qualifications');
$industryjob->save();

Then save the related models using sync because it's many-to-many relationship and those related models are already created and available in the database:

if (isset($input['divisions'])) {
    // Pass the array of ids to sync method
    $industryjob->divisions()->sync($input['divisions']);
}

If you use the foreach loop then you may use something like this;

foreach ($input['divisions'] as $divId) {
    $industryjob->divisions()->attach($divId);
}

Check more about inserting related models on Laravel website.

The Alpha
  • 143,660
  • 29
  • 287
  • 307
  • Thanks, this has proven very useful. In the end it was a simple change. $industryjob->save(); $industryjob->divisions()->sync(Input::get('divisions')); – user3189734 Jun 04 '14 at 09:35