Php Laravel:如何从查询结果中获取模型?

Php Laravel:如何从查询结果中获取模型?,php,laravel,eloquent,Php,Laravel,Eloquent,假设我有一个查询,其中包括返回用户id的查询,这个查询是使用DB::table()…而不是使用模型构建的,因此,我得到了一个集合,其中每个检索到的行都有数组,如下所示: user_id | calculated_data --------+---------------- 1 | 123 2 | 111 3 | 222 ... | ... $flights = App\Flight::all(); foreach

假设我有一个查询,其中包括返回用户id的查询,这个查询是使用
DB::table()…
而不是使用模型构建的,因此,我得到了一个集合,其中每个检索到的行都有数组,如下所示:

user_id | calculated_data
--------+----------------
      1 |     123
      2 |     111
      3 |     222
    ... |     ...
$flights = App\Flight::all(); 

foreach ($flights as $flight) {
    echo $flight->name;
}
foreach ($flights as $flight) {
    echo $flight->user->name;
}
Supose我将这个集合存储在
$data
变量上,当然如果我使用
foreach($d作为数据){$d->user\u id…}
将起作用

但是我希望这个查询返回更像ORM所做的事情,因此,相反地,返回用户模型,以便我可以执行,例如,
$data->user->name


这能做到吗?如果是,怎么做?

您需要使用Eloquent调用“ORM方式”的值。我没有找到任何与ORM相关的查询生成器

你可以这样做:

user_id | calculated_data
--------+----------------
      1 |     123
      2 |     111
      3 |     222
    ... |     ...
$flights = App\Flight::all(); 

foreach ($flights as $flight) {
    echo $flight->name;
}
foreach ($flights as $flight) {
    echo $flight->user->name;
}
以ORM的方式,您可以让用户像这样:

user_id | calculated_data
--------+----------------
      1 |     123
      2 |     111
      3 |     222
    ... |     ...
$flights = App\Flight::all(); 

foreach ($flights as $flight) {
    echo $flight->name;
}
foreach ($flights as $flight) {
    echo $flight->user->name;
}

当然,您需要设置正确的关系。

您可以使用
hydrate()
函数,它接受
stdClass
对象的
数组(甚至是AFAIR关联数组)作为输入,并返回
雄辩模型的
集合,因此您可以执行以下操作:

user_id | calculated_data
--------+----------------
      1 |     123
      2 |     111
      3 |     222
    ... |     ...
$flights = App\Flight::all(); 

foreach ($flights as $flight) {
    echo $flight->name;
}
foreach ($flights as $flight) {
    echo $flight->user->name;
}
$result=DB::table('users')->take(10)->get();
$users=App\User::水合物($result->all());
您甚至可以使用
fromQuery()
函数直接从原始查询中获取
雄辩模型的集合,即:

$users=App\User::fromQuery('SELECT*FROM users WHERE id>?',[2])
更新:如果您的集合中没有模型的所有字段,您可以通过一个查询预加载所需的所有用户,并修改您的集合,即:

$users=App\User::find($data->pull('User_id'));
$data->transform(函数($item)使用($users){
$item->user=$users->where('id',$item->user\u id)->first()
返回$item;
}); 

5.8.32待修改precise@miken32我只是想知道我对这个问题的标记有什么错?版本特定的标记最好用于版本特定的功能。因此,如果V5中引入了一个新功能,并且您正在询问它,那么您将使用laravel-5。这是框架的一个基本特性,从第一天开始就有了,所以版本不可知标签就足够了。除此之外,没有人能真正帮助你。我们不知道你是如何到达餐桌的,还有其他的东西。你要么求助于
User::find(…)
或ORM将原始DB语句与(右)join请求结合起来。似乎使用
hydrate()
时,您必须传递整个对象(我指的是数据),也就是说,才能将其转换为模型。在我的情况下,我没有对象的镜像表示,因为它包含其他数据,但谢谢,了解这一点很有意思@luisfer如果你发布了一个普通的问题,没有查询和数据转储,你得到了一个普通的答案,我想这是你所能找到的最好的关于你给出的细节的答案。是的,我知道如何使用ORM。但是在这种情况下,我需要做的比我在ORM方面的知识更多,我有两个视图(不是表)来提供我需要的数据