2013-10-14 92 views
0

我使用Laravel 4的Eloquent來製作三種不同的模型:一個用戶模型,一個Agent模型和一個Performer模型。任何用戶都可以以普通用戶身份註冊,或者可以付費成爲代理或執行者。由於代理和執行者都有特殊配置文件,因此我爲表演者和代理創建了包含其配置文件的單獨表格,並且在用戶表格中僅顯示用戶「類型」,表示它們是普通用戶還是普通用戶或代理商。如何將模型A與Laravel中的模型B或模型C相關聯?

這意味着User模型將與Performer和Agent都有has_one關係。因爲用戶只會是其中的一員,所以我想知道是否有可能讓用戶模型僅與其中一個(或者沒有)關聯,具體取決於用戶的類型?

我有一種強烈的感覺,我正在以這種錯誤的方式去做。我是否應該將用戶模型與兩者聯繫起來,並在使用關係之前進行檢查(開始時似乎很明顯,但也不是正確的方法)?有一個更好的方法嗎?

編輯:我上面指出,用戶可能不是那些,但只是一個普通用戶,但它似乎我太模糊:所以,如果用戶沒有支付成爲代理或執行者,他們只是一個普通的用戶。在這種情況下,最好的策略是隻需手動填寫userable_type列的「用戶」,並在執行$user->userable之前檢查並確保它不等於「用戶」?

+0

檢查出多態關係。這可能正是你需要的,你已經有了自己的設置。基本上你會找到你的用戶,調用關係,它會返回一個Agent或Performer的實例。 http://laravel.com/docs/eloquent#polymorphic-relations – user1669496

回答

1
Schema::create('users', function($table) 
{ 
    $table->increments('id'); 
    $table->string('username'); 
    $table->string('imageable_type'); // Will be a string of the class name Agent or Performer 
    $table->string('imageable_id'); // Will be the ID of the Agent or Performer. 
}); 

class User extends Eloquent 
{ 
    public function imageable() 
    { 
     return $this->morphTo(); 
    } 
} 

class Agent extends Eloquent 
{ 
    public function user() 
    { 
     return $this->morphMany('User', 'imageable'); 
    } 
} 

class Performer extends Eloquent 
{ 
    public function user() 
    { 
     return $this->morphMany('User', 'imageable'); 
    } 
} 

$user = User::find(1); 
$type = $user->imageable; // Type will be either an instance of Agent or Performer 

if($type instanceof Agent) 
{ 
    // Do agent stuff 
} else { 
    // Do performer stuff 
} 
+0

哈!我爲其他模型使用多態,但我甚至沒有考慮過這個。這真是愚蠢的我。非常感謝! – BenjaminRH

+0

啊,好的我有一個關於你的答案的問題。它適用於用戶是代理還是執行者,但如果用戶只是普通用戶,該怎麼辦?用戶不一定是這兩種特殊用戶類型中的任何一種。 – BenjaminRH

+1

你可能會將用戶表變成自己。我還沒有測試過,但我認爲它應該可以正常工作。 – user1669496

相關問題