在Laravel 4中使用预先加载时,我们可以使用以下方法加载关系:
$user = User::with('role')->find(1);
将返回用户的表示,我们可以通过
访问角色的表示$user->roles();
现在我们也可以使用where
过滤预先加载的内容$user = User::with(array('role' => function($query) {
$query->where('name', 'like', '%key%');
}))->find(1);
只有在角色名称字段包含key
的位置填充角色时,才会返回用户表示。
我们可以通过添加select()
约束来限制在用户表示上返回的字段。
$user = User::with(array('role' => function($query) {
$query->where('name', 'like', '%key%');
}))->select('email')->find(1);
仅返回用户表示中的email
和id
字段,但返回角色表示中的所有字段。
我希望我可以限制关系中返回的字段(用于api),但我似乎无法找到方法;我尝试过以下两种方法。
$user = User::with(array('role' => function($query) {
$query->select('name');
}))->find(1);
和
$user = User::with('role')->select('role.name')->find(1);
答案 0 :(得分:1)
您可以在关系定义中指定所需的列。
// app/model/User.php
<?php
class User extends Eloquent
{
public function roles()
{
return $this->hasMany('Role')->select(array('id', 'name'));
}
}
array('id', 'name')
数组中的第一个参数是角色表上的外键列,它将用户表连接到用户表。
修改(根据您的评论)
我尝试了几件事,你在第一个例子中走的是正确的道路。只是一点改变:
$user = User::with(array('role' => function($query) {
$query->select(array('id', 'name'));
}))->find(1);
这应该有用。
答案 1 :(得分:1)
虽然它不会过滤返回哪些列,因为如果您想要防止抓取相当大的列(例如博客帖子内容),这不是一个可行的解决方案,这可以用于过滤哪些列在表示时可见作为数组或Json。
//fetch the unfiltered relationship
$user = User::with('roles')->find($id);
//loop over each model in that relationship and set the visible properties
$user->roles->each(function($role){
$role->setVisible(['id', 'name', 'pivot']);
});