我一直對此感到困惑。 所以我有三種型號:Agent
,Customer
和User
。Laravel:如何定義這種關係
Agent
是User
。
Customer
也是User
,但屬於Agent
。可以是Agent
或Customer
。
現在我想知道這三種模型的雄辯關係。先謝謝您的幫助。
我一直對此感到困惑。 所以我有三種型號:Agent
,Customer
和User
。Laravel:如何定義這種關係
Agent
是User
。
Customer
也是User
,但屬於Agent
。可以是Agent
或Customer
。
現在我想知道這三種模型的雄辯關係。先謝謝您的幫助。
我能想到的最好的方法是使用多對多的多態關係。
由於用戶既可以是代理,也可以是客戶,我們將創建用戶表並創建另一個表,然後我們將其命名爲可用表,這將有助於將用戶映射到代理,客戶或兩者。
的userable表將這些領域
user_id - integer
userable_id - integer
userable_type - string
的USER_ID將持有的用戶ID,userable_id將持有的任一種藥劑或客戶ID和userable_type擁有代理或Custmoer型號類別名稱
用戶模式
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
public function agents()
{
return $this->morphedByMany('App\Agent', 'userable');
}
public function customers()
{
return $this->morphedByMany('App\Customer', 'userable');
}
}
代理模型
namespace App;
use Illuminate\Database\Eloquent\Model;
class Agent extends Model
{
public function users()
{
return $this->morphToMany('App\User', 'userable');
}
}
客戶型號
namespace App;
use Illuminate\Database\Eloquent\Model;
class Customer extends Model
{
public function users()
{
return $this->morphToMany('App\User', 'userable');
}
}
也許這將是 「乾淨」 如果User
是(抽象)類,都Agent
和Customer
延長User
?那麼你會有兩種賬戶。然後,您將在Agent
和Customer
(或者多對多關係,如果Customer
可以具有多於一個的Agent
)之間具有一對多關係。
缺點是,你不會只有一個列表,但兩個和Agent
不能只是成爲一個Customer
,但連接更清晰,並在數據庫級別,你不必檢查應用程序級別上的關係(例如,當誰擁有Agent
變成Agent
時會發生什麼情況,是否有Agent
->Agent
關係?)。
然後,您還可以更容易地將額外的字段添加到Agent
或Customer
而不會影響另一個字段。
您不必/不應該有3個型號,但一個抽象類User
和2派生類Agent
和Customer
。那麼你們的關係非常簡單:
// Agent extends User
public function customers()
{
return $this->hasMany(Customer::class, 'agent_id');
}
// Customer extends User
public function agent()
{
return $this->belongsTo(Agent::class, 'agent_id');
}