Laravel elocuente donde el campo = (...) subconsulta

JK:

Tengo tres tablas: (Muchos-A-Muchos relación entre los usuarios y listas de palabras, y es userlistrels conector)

users:
id
name

wordlists:
id
name
creator_id

userlistrels:
id
user_id
wordlist_id

Quiero ejecutar siguiente consulta:

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 )

Cómo escribir este tipo de subconsultas ( WHERE foo= ( subquery )) en la interfaz laravel?
Cubiertas de documentación SELECT * FROM (subquery) WHERE contition,
SELECT * FROM table WHERE (subquery LIMIT 1) = 'foo',
pero noSELECT * FROM table WHERE field=(subquery)

He intentado muchos métodos, y este es el único que no lanza una excepción, sin embargo, no funciona:

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

¿Podría alguien por favor dígame lo que está mal con este código, o cómo hacer este tipo de subconsulta?

EDIT: Mi consulta SQL que estaba mal. consulta correcta para lo que he intentado hacer es: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;

Y código correcto 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:

Creo que el problema viene de su subconsulta. Eso subconsulta devolverá múltiples creator_iddepende de su base de datos, por lo que hay dos soluciones.

Solución 1:

Utilizar whereInen lugar de 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();

Solución 2:

append limit(1)después 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();

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=347623&siteId=1
Recomendado
Clasificación