Laravel Eloquent поле WHERE = (...) подзапрос - PullRequest
0 голосов
/ 19 марта 2020

У меня есть три таблицы: (отношение «многие ко многим» между пользователями и списками слов, а userlistrels является соединителем)

users:
id
name

wordlists:
id
name
creator_id

userlistrels:
id
user_id
wordlist_id

Я хочу выполнить следующий запрос:

SELECT * FROM users WHERE id=( SELECT wordlists.creator_id FROM userlistrels JOIN wordlists ON wordlists.id=userlistrels.wordlist_id WHERE userlistrels.user_id=$curr_user )

Как написать этот тип подзапросов (WHERE foo= ( subquery )) в Laravel интерфейсе?
Документация охватывает SELECT * FROM (subquery) WHERE contition,
SELECT * FROM table WHERE (subquery LIMIT 1) = 'foo',
, но не SELECT * FROM table WHERE field=(subquery)

I ' Мы перепробовали много подходов, и это единственный, который не вызывает исключения, однако он не работает:

$curr_user = // id of my user
$users = User::where('id', function($query) use($curr_user){
        $query->select('wordlists.creator_id')
            ->from('userlistrels')
            ->join('wordlists', 'wordlists.id', '=', 'userlistrels.wordlist_id')
            ->where('userlistrels.user_id', $curr_user);
    })->get();

Может кто-нибудь сказать мне, что не так с этим кодом, или как сделать это тип подзапроса?

РЕДАКТИРОВАТЬ: Мой SQL запрос был неверным. Правильный запрос для того, что я пытался сделать, это: SELECT * FROM users JOIN (SELECT wordlists.creator_id FROM userlistrels JOIN wordlists ON wordlists.id=userlistrels.wordlist_id WHERE userlistrels.user_id=$curr_user) AS nn ON users.id=nn.creator_id;

И правильный laravel код:

$users_sub = DB::table('userlistrels')->join('wordlists', 'wordlists.id', '=', 'userlistrels.wordlist_id')->where('userlistrels.user_id', $curr_user)->select('wordlists.creator_id');

        $users = DB::table('users')
            ->joinSub($users_sub, 'tt', function ($join) {
                $join->on('users.id', '=', 'tt.creator_id');
            })->get();

1 Ответ

1 голос
/ 19 марта 2020

Я думаю, что проблема связана с вашим подзапросом. Этот подзапрос вернет кратное creator_id, в зависимости от вашей базы данных, поэтому есть два решения.

Решение 1:

Используйте whereIn вместо where:

User::whereIn('id', function($query) use($curr_user){
        $query->select('wordlists.creator_id')
            ->from('userlistrels')
            ->join('wordlists', 'wordlists.id', '=', 'userlistrels.wordlist_id')
            ->where('userlistrels.user_id', $curr_user);
    })->get();

Решение 2:

добавление limit(1) после where('userlistrels.user_id', $curr_user):

User::whereIn('id', function($query) use($curr_user){
        $query->select('wordlists.creator_id')
            ->from('userlistrels')
            ->join('wordlists', 'wordlists.id', '=', 'userlistrels.wordlist_id')
            ->where('userlistrels.user_id', $curr_user)
            ->limit(1);
    })->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...