如何在Laravel中隐藏关系列?

时间:2018-08-14 13:15:54

标签: php laravel eloquent

我有一个这样的声明:

App\User::with('client')->find(2)->makeHidden('client.phone_no');

我想从关系中隐藏某些列,但是我不能使用makeHidden()来做到这一点,因为它只接受Model的参数,而不是关系。

如何隐藏关系中的某些列?

5 个答案:

答案 0 :(得分:2)

With接受回调以修改查询。

$users = User::with(['client' => function($query) {
        $query->select(['id', 'name']);
    }])->find(2);

您还可以在客户端模型上定义默认的隐藏属性

protected $hidden = ['phone_no'];

答案 1 :(得分:1)

如果您不想通过将其添加到phone_no属性中而为所有请求隐藏hidden,则可以执行以下操作:

$user = App\User::with('client')->find(2);
$user->client->makeHidden('phone_no');
return $user;

正如我在对原始问题的评论中所述:我也发现了this方法。我认为这是您要更频繁地排除列时应使用的方法。如果您只想排除一次列,那么我的解决方案就足够了。

答案 2 :(得分:1)

您可以在模型中创建NSString *str = @"This is just Added < For testing %@ ___ & >"; NSRange r1 = [str rangeOfString:@"<" options: NSBackwardsSearch]; NSRange r2 = [str rangeOfString:@">" options: NSBackwardsSearch]; NSRange rSub = NSMakeRange(r1.location + r1.length, r2.location - r1.location - r1.length); NSString *sub = [str substringWithRange:rSub]; 并将其应用到构建器中

在模型中定义这些功能

scope

现在在查询构建器中使用它

protected function columns(){
    return Schema::getColumnListing('clients');
}

public function scopeExclude($query, $value = array()) 
{
  return $query->select( array_diff( $this->columns(), $value) );
}

答案 3 :(得分:1)

您可以隐藏查询结果中的列(无需加载):

$user = User::find(2);
$user->client->makeHidden('phone_no');

或者您甚至没有从数据库中获取它:

$user = User::with('client:id,user_id,...' /* other columns except phone_no */)->find(2);

答案 4 :(得分:0)

尝试一下:

App\User::with(['client' => function($query){
   $query->makeHidden('client.phone_no')
}])->find(2);