简体   繁体   中英

How to hide relationship columns in laravel?

I have a statement like this:

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

I want to hide certain columns from a relation, but I can't do that with makeHidden() , because it only takes the arguments for the Model not the relation.

How can I hide some columns from the relation?

If you don't want to hide the phone_no for all the requests by adding it to the hidden property, you could do something like this:

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

As I stated in my comment to the original question: I found this method as well. I believe this should be the method you should use when you want to exclude columns more often. If you only want to exclude a column once, my solution should be sufficient.

With accepts a callback to modify the query.

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

You could also define default hidden attributes on your Client model

protected $hidden = ['phone_no'];

You can create a scope in your model and apply it in builder

Define these functions in your model

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

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

Now use it in query builder

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

You can either hide the column in the query result (eager loading is unnecessary):

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

Or you don't even get it from the database:

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

Try this:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM