从原始查询中获取 Laravel Eloquent Collection

cha*_*lie 7 php mysql query-builder eloquent laravel-5

我正在使用 Laravel 5 并且我有一个用户表,以及两个包含用户之间关系的表“客户”和“员工”。

我想获得登录用户的所有客户和员工。

我有一个原始查询,它可以正常工作:

select users.* from clients, users
where clients.id_marchand = 8 and users.id = clients.id_client 
union 
select users.* from employes, users 
where employes.id_marchand = 8 and users.id = employes.id_employe 
order by `seen` asc, `created_at` desc limit 25 offset 0
Run Code Online (Sandbox Code Playgroud)

原始查询返回一个数组,但我需要获得一个 Eloquent 集合,例如:

return $this->model
->where(...)
->oldest('seen')
->latest()
->paginate($n);
Run Code Online (Sandbox Code Playgroud)

我尝试了很多不同的可能性,但它们都不起作用......

有没有办法用子查询或其他方法来做到这一点?

Jos*_*fat 7

您可以使用将查询结果转换为集合 collect()

$users = \DB::select( "SELECT users.*
FROM clients,
       users
  WHERE clients.id_marchand = 8
    AND users.id = clients.id_client
  UNION
  SELECT users.*
  FROM employes,
       users
  WHERE employes.id_marchand = 8
    AND users.id = employes.id_employe
  ORDER BY `seen` ASC,
           `created_at` DESC LIMIT 25
  OFFSET 0" );

return collect( $users );
Run Code Online (Sandbox Code Playgroud)

如果结果不仅仅是您应该使用的模型集合hydrate()https://laravel.com/api/5.3/Illuminate/Database/Eloquent/Model.html#method_hydrate)对于您提供的示例,代码应如下所示:

$users = \DB::select( "SELECT users.*
  FROM clients,
       users
  WHERE clients.id_marchand = 8
    AND users.id = clients.id_client
  UNION
  SELECT users.*
  FROM employes,
       users
  WHERE employes.id_marchand = 8
    AND users.id = employes.id_employe
  ORDER BY `seen` ASC,
           `created_at` DESC LIMIT 25
  OFFSET 0" );

return User::hydrate($users);
Run Code Online (Sandbox Code Playgroud)

请注意,此方法较慢,并且对于大量数据,如果结果太大而无法在 ram 中分配,则此方法可能会崩溃


Tim*_*olo 4

您可以运行查询,然后使用以下命令将其填充到模型中hydrate:例如:

$userData = DB::select('SELECT * FROM users ...');
$userModels = User::hydrate($userData);
Run Code Online (Sandbox Code Playgroud)