bonzo
bonzo

Reputation: 96

laravel eloquent one-to-one save relation

Having first steps in laravel, and just hit the wall.

I Have two entities:

    Schema::create('company', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->increments('id');
        $table->string('name')->unique();
        $table->integer('addressid')->unsigned()->nullable();
    });

and

Schema::create('addresses', function (Blueprint $table) {
        $table->engine = "InnoDB";
        $table->increments('id');
        $table->string('street');
        (...)
    });

     Schema::table('company', function($table) {
        $table->foreign('addressid')
            ->references('id')->on('addresses')
            ->onDelete('cascade');
    });

Models are

class Address extends Model {
    public function shipyard() {
        return $this->belongsTo('App\Company', 'addressid');
    }
}
class Company extends Model {
    public function address() {
        return $this->hasOne('App\Address', 'id', 'addressid');
    }
}

When I want to create these entities in DB I use one form in HTML to gather all data. Then I post request and do:

Route::post('/company', function (Request $request) {
    (...validation...)

    $company = new Company();
    $company->name = $request->name;

    $address = new Address();
    $address->street = $request->street;
    (...)

    $company->address()->save($address);
    $company->save();
    return redirect('/');
});

As a result I have two entities in DB, but the "addressid" field is null. Why?

Upvotes: 4

Views: 2806

Answers (2)

MeSko
MeSko

Reputation: 46

Change relation in company (relation in address you can delete):

class Company extends Model {
   public function address() {
         return $this->belongsTo('App\Address', 'addressid');
 } }

Saving code:

Route::post('/company', function (Request $request) {
    (...validation...)

    $company = new Company();
    $company->name = $request->name;

    $address = new Address();
    $address->street = $request->street;
    (...)

    $address->save();
    $company->address()->associate($address);
    $company->save();
    return redirect('/');
});

Upvotes: 3

oseintow
oseintow

Reputation: 7421

class Address extends Model {

   // Added fillable array for mass assigment
   protected $fillable = ['street'];

   public function shipyard() {
    return $this->belongsTo('App\Company', 'addressid');
   }
}

class Company extends Model {

   // Added fillable for mass assignment
   protected $fillable = ['name','addressid'];

   // The second argument for the hasOne takes a foreign key not a primary key
   public function address() {
      return $this->hasOne('App\Address', 'addressid');
   }
}

 $company = new Company();
 $company->name = $request->name;
 $company->save();

 $company->address()->create($request->street)

Upvotes: 0

Related Questions