hasOne () с выбором и условием где - PullRequest
0 голосов
/ 29 мая 2020

У меня две таблицы:

  1. ForumPost , со структурой:
+---------+---------+
|      id | message |
+---------+---------+
ForumPostVote , со структурой:
+---------+---------+---------+
|      id | post_id | user_id |
+---------+---------+---------+

Вот два моих модельных класса для каждого:

  1. ForumPost. php
class ForumPost extends Model
{
    protected $with = [
        'userVote'
    ];

    public function votes()
    {
        return $this->hasMany('App\ForumPostVote', 'post_id', 'id');
    }

    public function userVote()
    {
        if (Auth::check())
        {
            return $this->hasOne('App\ForumPostVote', 'post_id', 'id')->where('user_id', Auth::user()->id)->select('id');
        }

        return null;
    }
}
ForumPostVote. php
class ForumPostVote extends Model
{
    public function user()
    {
        return $this->belongsTo('App\User');
    }

    public function post()
    {
        return $this->belongsTo('App\ForumPost', 'id', 'post_id');
    }
}

Как видите, в ForumPost. php у меня есть функция userVote() где я пытаюсь выбрать id из ForumPostVote , где идентификатор пользователя совпадает с зарегистрированным пользователем.

Когда я делаю запрос, он возвращает null. Если я удалю ->select('id'), он вернет объект как обычно:

"user_vote": {
    "id": 1,
    "post_id": 1,
    "user_id": 1
}

Если я попробую что-то вроде:

public function userVote()
{
    if (Auth::check())
    {
        $query = $this->hasOne('App\ForumPostVote', 'post_id', 'id')->where('user_id', Auth::user()->id);

        return $query->id;
    }

    return null;
}

Если я это сделаю:

public function userVote()
{
    if (Auth::check())
    {
        return $this->hasOne('App\ForumPostVote', 'post_id', 'id')->where('user_id', Auth::user()->id)->select(['id', 'post_id']);
    }

    return null;
}

Это возвращает:

"user_vote": {
    "id": 1,
    "post_id": 1
}

Но это не то, что я хочу. Я только хочу id.

Что я делаю не так?

1 Ответ

0 голосов
/ 30 мая 2020

если я вас правильно понимаю, между ForumPost и пользователем существует связь «многие-ко-многим» ... а сводная таблица - ForumPostVote

1 - forumPostVote должен наследовать от Pivot, а не от модели.

https://laravel.com/docs/7.x/eloquent-relationships#defining -custom-intermediate-table-models

2- если вы хотите получить идентификатор сводной таблицы для текущего пользователя:

public function userVote()
{
    if (Auth::check())
    {
$value=$this->votes()->where('user_id',Auth::user()->id)->first();
if($value!=null) return $value->id;
        return value;
    }

    return null;
}

обратите внимание, что если в таблице ForumPostVote нет соответствующего идентификатора, результат будет нулевым

...