2016-02-24 52 views
0

我正在使用Laravel 5.2。爲什麼我可以在一對一的關係中提交多個記錄?有兩個表格,userprofile,它們有一對一的關係。爲什麼我可以在一對一的關係中提交多個記錄?

用戶:

class User extends Authenticatable 
{ 
    public function profile() 
    { 
     return $this->hasOne(Profile::class); 
    } 
} 

簡介:

class Profile extends Model 
{ 
    public function user() 
    { 
     return $this->belongsTo(User::class); 
    } 
} 

我設置了一個一對一的關係,但我可以通過一個用戶帳戶提交多個記錄插入表profile。爲什麼是這樣?

+0

它必須是'爲配置文件hasOne'關係也是如此。 –

+0

你爲什麼使用belongsTo? – Drudge

+0

@Drudge文檔說:https://laravel.com/docs/5.2/eloquent-relationships#one-to-one,@JilsonThomas用'hasOne'替換'belongsTo',問題也存在。 – sunshine

回答

2

您的關係設置正確。 hasOnehasMany之間唯一的區別是hasOne將只返回第一個相關記錄。沒有任何東西可以阻止你嘗試關聯多條記錄,但是當你檢索相關記錄時,你只能得到一條記錄。

例如,給定下面的代碼:

$user = User::first(); 
$user->profile()->save(new Profile(['name' => 'first'])); 
$user->profile()->save(new Profile(['name' => 'second'])); 

$user->load('profile'); 
$echo $user->profile->name; // "first" 

這是完全有效的代碼。它將創建兩個新的配置文件,並且每個配置文件將有一個user_id設置爲指定的用戶。但是,當您通過$user->profile訪問相關配置文件時,它只會加載其中一個相關配置文件。如果您已將其定義爲hasMany,則會加載所有相關配置文件的集合。

如果你想防止意外創建多個配置文件,你需要做到這一點在你的代碼:

$user = User::first(); 

// only create a profile if the user doesn't have one. 
// don't use isset() or empty() here; they don't work with lazy loading. 
if (!$user->profile) { 
    $user->profile()->save(new Profile()); 
} 
相關問題