我看到Laravel的ORM纠结了以下内容:
Scenerio:所有用户都有一个监视列表,监视列表包含其他用户。
我似乎无法让关系正常工作,因为它们是周期性的,到目前为止,我有以下内容:
class UserWatchlist extends Model
{
protected $table = 'UserWatchlist';
public function Owner() {
return $this->belongsTo('App\User');
}
public function WatchedUsers() {
return $this->hasMany('App\User');
}
}
Schema::create('UserWatchlist', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('Users')->onDelete('cascade');
$table->integer('watched_id')->unsigned();
$table->foreign('watched_id')->references('id')->on('Users')->onDelete('cascade');
$table->timestamps();
});
class User extends Model
{
public function Watchlist() {
return $this->hasOne('App\UserWatchlist');
}
public function WatchedBy() {
return $this->belongsToMany('App\UserWatchlist');
}
}
它并没有超越我期待的正确形态。我错过了一些基本的东西吗?
答案 0 :(得分:3)
由于UserWatchlist
是一个数据透视表,我认为你面临着多对多的关系,这两个关系的元素都是同一个模型(User
)
如果是这种情况,则不应为数据透视表UserWatchlist
构建模型,但您所要做的就是通过数据透视表设置用户之间的关系:
class User extends Model
{
//get all the Users this user is watching
public function Watchlist()
{
return $this->belongsToMany('User', 'UserWatchlist', 'user_id', 'watched_id' );
}
//get all the Users this user is watched by
public function WatchedBy()
{
return $this->belongsToMany('User', 'UserWatchlist', 'watched_id', 'user_id' );
}
}
检查here以获取有关多对多关系的更多信息