2017-10-21 189 views
0

我即将对查询感到疯狂,有人可以帮助我翻译查询以在laravel中工作,或以“laravel方式”编写。加入laravel的子查询

查询代码如下,它使用MySQL。

我被卡住的部分是在第一个加入子查询到另一个加入它。

SELECT 
    usr.token, 
    usr.id, 
    usr.username, 
    usr.sn, 
    usr.givenname, 
    usr.telefone_numero, 
    usr.active, 
    usr.unidade_id, 
    usr.divisao_id, 
    usr.secao_id, 
    clients.nick, 
    posto_grad.sigla AS quadro_sigla, 
    log_logradouro_complemento, 
    log_logr.nome AS log_logradouro_nome, 
    log_logr.cep AS log_logradouro_cep, 
    log_bairro.nome AS log_bairro_nome, 
    log_localidade.nome AS log_localidade_nome, 
    log_uf.sigla AS log_uf_sigla 
FROM 
    users usr 
     LEFT JOIN 
    (SELECT 
     usr_log1.* 
    FROM 
     users_log_logradouro AS usr_log1 
    LEFT JOIN users_log_logradouro AS usr_log2 ON usr_log1.user_id = usr_log2.user_id 
     AND usr_log1.created_at < usr_log2.created_at 
    WHERE 
     usr_log2.user_id IS NULL) AS temp ON (usr.id = temp.user_id) 
     LEFT JOIN 
    log_logradouro log_logr ON temp.log_logradouro_id = log_logr.id 
     INNER JOIN 
    clients ON clients.matricula = usr.givenname 
     INNER JOIN 
    quadro ON quadro.id = clients.quadro_id 
     INNER JOIN 
    posto_graduacao posto_grad ON posto_grad.id = clients.posto_graduacao_id 
     LEFT JOIN 
    log_bairro ON log_logr.log_bairro_id = log_bairro.id 
     LEFT JOIN 
    log_localidade ON log_bairro.log_localidade_id = log_localidade.id 
     LEFT JOIN 
    log_uf ON log_localidade.log_uf_sigla = log_uf.sigla 
WHERE 
    usr.departmentnumber IN (1,2,3,4) 

+0

为什么不laravel插入原始查询? –

+0

如果您不打算使用其他数据库类型,则可以使用'DB :: raw()'并使用原始SQL查询。节省您的工作量。 – Jeffrey

+1

“Laravel的方式”将是定义所有的模型和关系,并使用雄辩。 – Camilo

回答

1

尝试发送子查询作为原料表达如在leftJoin()方法的第一个参数,例如:

$subquery = '(SELECT 
        usr_log1.* 
       FROM 
        users_log_logradouro AS usr_log1 
       LEFT JOIN 
        users_log_logradouro AS usr_log2 
        ON usr_log1.user_id = usr_log2.user_id 
        AND usr_log1.created_at < usr_log2.created_at 
       WHERE 
        usr_log2.user_id IS NULL) 
       AS temp'; 

    DB::table('users as usr') 
     ->select(...) 
     ->leftJoin(DB::raw($subquery), 'usr.id', '=', 'temp.user_id') 
     ->leftJoin(...) 
     ->join(...) 
     ->join(...) 
     ->join(...) 
     ->leftJoin(...) 
     ->leftJoin(...) 
     ->leftJoin(...) 
     ->where(...) 
     ->get() 

有在这些问题类似的例子:

Laravel Fluent Query Builder Join with subquery

How to write this (left join, subquery) in Laravel 5.1?

更多信息abaut联接: https://laravel.com/docs/5.5/queries#joins

+0

我试过这个选项,但由于某种原因,它过滤了一些结果,因为我的ETA,我无法弄清楚为什么。所以我用了一个原始查询。谢谢 –

0

多亏了回答,几个测试后,我会选择使用DB ::表原始查询所有用户和它的工作非常出色

谢谢大家。

0

您可以尝试我的Eloquent extension enabling subqueries inside eloquent正是为这种情况而设计的。

在您的样品将是

User::selectRaw(....) 
->leftJoinSubquery(UserLogs::where(...)->leftJoin(...), 
    'temp', 
    function ($join) { 
     $join->on('users.id', '=', 'temp.user_id'); 
    } 
)