在与同一个表相关的两个字段上设置关系

时间:2016-09-29 23:08:09

标签: php laravel laravel-5 laravel-5.3

我有一个包含许多用户的users表,例如:

id | name
1  | mike
2  | nina
3  | john 

我还有一个posts表,其中user_id表示帖子的原始创建者,如果帖子被编辑锁定,则会填充locked_user_id

任何用户都可以锁定或打开帖子,但如果帖子被锁定,则只有用户可以编辑它。这是我的关系:

用户模型:

public function posts(){
    return $this->hasMany('App\Post');
}

发布模型:

public function user(){
    return $this->belongsTo('App\User');
}

我可以通过

轻松找回作者
$posts->user->name

我希望能够同时获得原始创建者用户和编辑者。例如,邮政表的样本:

| id | user_id |    post    | locked_user_id |
| 1  |    1    |  blah blah |       2        |

在这种情况下,$posts->user->name会返回 mike ,但我希望能够让当前锁定帖子的用户 nina

我该如何做到这一点?

1 个答案:

答案 0 :(得分:2)

假设locked_user_id可以为null,如果是,则返回的用户基于used_id,您可以将user()模型上的Post关系更新为:

public function user()
{
    if (!is_null($this->locked_user_id)) {
        return $this->belongsTo('App\User', 'locked_user_id', 'id');
    }

    return $this->belongsTo('App\User');
}

因此,如果有locked_user_id返回的已使用基于此字段,则返回的用户基于user_id字段

根据评论,如果您想要访问这两个用户,可以在Post模型上添加其他关系。例如

// Assuming `user_id` is not nullable, this will always return the original user
public function creator()
{
    return $this->belongsTo('App\User');
}

// Assuming `locked_user_id` is nullable, this will return either `null`, if there is no editor or the user that locked the post
public function editor()
{
    return $this->belongsTo('App\User', 'locked_user_id', 'id');
}

在您的代码上,您可以执行以下操作:

if (is_null($this->editor)) {
    dd('There is no editor');
} elseif ($this->editor->id === $this->creator->id) {
    dd('The original creator has locked the post');
} else {
    dd('The post was created by ' . $this->creator->name. ' but now is locked by ' . $this->editor->name);
}