2017-10-10 92 views
0

我有两个表UserCar。一个用户可能有一辆车。Laravel:负载关系和特定列

我有一个关系设置是这样的:

public function car() 
{ 
    return $this->hasOne('App\Car'); 
} 

我希望获取与汽车的用户,但只有选择的用户的name和汽车的color

如果我尝试

App\User::with('car:color')->select('name')->first()->toArray(); 

然后我不明白的汽车颜色。这是结果:

array:1 [▼ 
    0 => array:2 [▼ 
    "name" => "Max Mustermann" 
    "car" => [] 
    ] 
] 

是否有可能只获取用户的名称和车的颜色?

回答

1

它失败,因为User表没有color列。你必须访问关系才能获得颜色。

$user = User::has('car')->first(); 

print $user->car->color; 

AFAIK您将无法仅通过雄辩关系获取两个字段。实现这一目标的一个方法是使用查询生成器:

DB::table('users') 
    ->join('cars', 'users.id', '=', 'cars.user_id') 
    ->select('users.name', 'cars.color') 
    ->get(); 
+0

这只会从用户表中提取第一行。 –

+0

我明白你接近的作品,但这会返回用户的所有恶魔。我只希望我的用户对象具有2个属性,在这种情况下,只有'$ user-> name'和'$ user-> car-> color'不需要加载这两个表中的所有其他字段。 – Adam

+0

@亚当我更新了我的回答 –

1

你可以尝试这样的:

User :: Select("*")->with("car")->get(); 
+0

谢谢,你的方法奏效。但是有没有一个查询,以便返回的用户对象只有2个属性,在这种情况下只有'$ user-> name'和'$ user-> car-> color'?我的应用程序不需要从两个表中加载所有其他字段。当我编写原始的SQL命令时,我从来没有使用'SELECT * FROM' ...来获得速度 – Adam

+0

@Adam,我很高兴你的答案帮助我解决了问题,如果你接受这个答案并投票它起来。而对于你对速度的担心,我会说,这是ORM,不需要时间,因为正常的查询需要使用'select * from table'来获取,所以不用担心。这不会有什么巨大的区别。 –

1

这是正确的做法。

$users = User::with('car.color')->select('name')->get(); 

,然后就可以显示它们为:

foreach($users as $user){ 
    echo $user->name . " owns a " . $user->car->color . " car."; 
} 
+0

如果我这样做,那么'$ user-> car-color'为null – Adam