Laravel雄弁フィールド=(...)サブクエリ

JK:

私は3つのテーブルがあります(ユーザと単語リスト、および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)

私は多くのアプローチを試してみたが、これはそれが仕事をしませんが、例外をスローしない唯一のものです:

$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();

誰もがこのコードで間違っているものを私に教えてもらえ、またはサブクエリのこのタイプを作成する方法?

EDIT:私の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();
Tsakhog:

私はこの問題は、あなたのサブクエリから来ていると思います。複数を返すことサブクエリはcreator_id、データベースに依存しますので、2つのソリューションがあります。

解決策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:

APPEND 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();

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=347612&siteId=1