3

在 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);

这将只返回用户表示上的emailandid字段,但返回角色表示上的所有字段。

我希望我可以限制关系上返回的字段(用于 api),但我似乎找不到方法;我尝试了以下两种方法。

$user = User::with(array('role' => function($query) {
    $query->select('name');
}))->find(1);

$user = User::with('role')->select('role.name')->find(1);
4

2 回答 2

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);

这应该有效。

于 2013-09-11T12:06:12.570 回答
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']);
});
于 2013-09-11T23:28:51.153 回答