2016-03-19 6 views
2

После первых шагов в laravel, и просто нажмите на стену.laravel eloquent один-к-одному сохранить отношение

У меня есть два объекта:

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

и

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

Модели

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

Когда я хочу, чтобы создать эти объекты в БД, которые я использую одну форму в HTML, чтобы собрать все данные. Тогда я отправляю запрос и сделать:

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

В результате у меня есть два объекта в БД, но поле «AddressID» равна нулю. Зачем?

ответ

0

Изменение отношения в компании (отношение в адрес, который вы можете удалить):

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

Сохранение кода:

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

Большое спасибо. Оно работает. – bonzo

0
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)