在Laravel4中过滤返回关系的字段?

时间:2013-09-11 10:34:35

标签: php database laravel filtering eager-loading

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

仅返回用户表示中的emailid字段,但返回角色表示中的所有字段。

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

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

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

2 个答案:

答案 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']);
});