2014-07-01 62 views
2

我想創建簡單的關係,在User模型的數據庫中查找用戶的個人資料信息。Laravel關係正在返回null

在user.php的

我有:

class User extends Eloquent implements UserInterface, RemindableInterface { 
    ... 
    public function profile() { 
     return $this->hasOne('UserProfile'); 
    } 
    ... 
} 

和在模型/ UserProfile.php:

class UserProfile extends Eloquent{ 

    protected $table='user_profile'; 
    public function user() { 
     return $this->belongsTo('User'); 
    } 
} 

在數據庫users.user_iduser_profile.user_id1000

我要訪問用戶配置文件與此行控制器:

public function getIndex() 
{ 

    $profile = $user->profile; 
    dd($profile); 
    die; 
} 

dd()結果是:

NULL 

什麼我的關係問題?

+0

user_profile行是否存在於數據庫中? –

+0

@EvanDarwin是的。 –

+0

你的'getIndex()'從哪裏得到'$ user'? – Unnawut

回答

4

看起來像關係沒有加載。

或者嘗試使用eager-loading

User::with('user_profile')->get(); 

加載它們或更高版本延遲加載加載它們:

$user = Auth::user(); 
$user->load('user_profile'); 

也因爲你使用其他主鍵屬性比id,你需要指定它(或在您的關係聲明中):

protected $primaryKey = 'user_id'; 
+0

我不認爲急切的加載與此有關。但設置主鍵應該。 –

+1

它很沮喪地瞭解這個.. laravel還不夠成熟 –

1

爲了您users表,你是不是id使用不同的主鍵其他如預期的那麼你User模型,你應該明確地聲明protected $primaryKey = 'user_id',你也可以使用這個:

// Not tested with same foreign and local key 
return $this->hasOne('UserProfile', 'user_id', 'user_id'); 

但最好是保持兩個鍵不同,可能您可以將users.user_id重命名爲users.id。如果您將users.user_id重命名爲users.id,那麼所有內容都不會發生任何變化。

0

我曾經遭受過同樣的問題,原因是後面有一個空白字符將被用作關係。簡單地刪除它解決了。可能不會直接與您的問題相關,但我相信這可能會節省數小時通過搜索引擎訪問此頁面的人員。

0

對我來說,解決辦法是預先加載就像@zwacky建議:

或更高版本延遲加載加載它們:

>$user = Auth::user(); 
>$user->load('user_profile'); 

這將做解決方案時user_profile有剛剛創建,您需要在代碼的另一部分訪問user_profile$user。 看起來像laravel不會立即更新父模型。