Laravel продолжает откатывать все отношения, несмотря на использование `with ()` - PullRequest
0 голосов
/ 15 мая 2018

По какой-то странной причине мое приложение Laravel 5.6 продолжает возвращать объект User со всеми его связями.

Мой запрос в Api/UserController:

    public function show($user_id)
    {
        return User::with('meta', 'roles')->find($user_id);
    }

Ответ:

{
    "id": 1,
    "name": "Admin",
    "email": "admin@example.com",
    "company_id": 1,
    "meta": {
        "id": 1,
        "user_id": 1,
        "laptop": 0,
        "mobile": 0,
        "created_at": "2018-03-07 14:58:41",
        "updated_at": "2018-04-06 16:13:10"
    },
    "roles": [
        {
            "id": 2,
            "name": "admin",
            "label": "Admin",
            "permissions": null,
            "pivot": {
                "user_id": 1,
                "role_id": 2
            }
        }
    ],
    "company": {
        "id": 1,
        "name": "Company",
        "active": 1,
        "created_at": "2018-04-12 15:06:01",
        "updated_at": "2018-05-15 11:20:15",
        "is_max_user_limit_reached": true
    }
}

Маршрут (внутри routes/api.php):

Route::group(['middleware' => 'auth:api'], function () {
    Route::resource('/users', 'Api\UserController', ['as' => 'api']);
});

Модель пользователя:

        namespace App\Models;

        use App\Models\Role;

        class User extends Authenticatable implements HasMedia
        {
            use HasApiTokens, Notifiable, Billable, HasMediaTrait;

            protected $table = 'users';

            protected $fillable = ['name', 'email', 'password', 'is_active', 'company_id', 'stripe_id', 'card_brand', 'card_last_four', 'trial_ends_at'];

            protected $hidden = ['password', 'remember_token','card_brand', 'card_last_four'];

            protected $appends = ['extra', 'is_staff_only', 'first_four_training_sections', 'is_free_tier', 'is_agency_tier', 'is_team_tier', 'is_enterprise_tier'];


            public static $rules = [
                // create rules
                'name' => 'required',
                'email' => 'required|email|unique:users'
            ];


        public function meta()
        {
            return $this->hasOne(UserMeta::class);
        }


        public function company()
        {
            return $this->belongsTo(Company::class, 'company_id')->where('active', 1);
        }


        public function roles()
        {
            return $this->belongsToMany(Role::class);
        }


 public function getExtraAttribute()
    {
        return [
            'roles' => [
                'cpo' =>  (int)$this->hasRole('cpo'),
                'ap' =>  (int)$this->hasRole('ap'),
                'cao' => (int)$this->hasRole('cao'),
            ]
        ];
    }


    public function getIsStaffOnlyAttribute()
    {
        if($this->roles->count() == 1 && $this->hasRole('staff')) {
            return true;
        }
        return false;
    }

    public function getIsFreeTierAttribute()
    {
       return $this->company->subscription_tier == 0;
    }

    public function getIsAgencyTierAttribute()
    {
        return $this->company->subscription_tier == 1;
    }


    public function getIsTeamTierAttribute()
    {
        return $this->company->subscription_tier == 2;
    }


    public function getIsEnterpriseTierAttribute()
    {
        return $this->company->subscription_tier == 3;
    }



    public function getFirstFourTrainingSectionsAttribute() {
        return UserTrainingSection::where('user_id', $this->id)->orderBy('id')->take(4)->get();
    }

}

Это очень странное поведение. Я запрашиваю только относящиеся к roles и meta данные, но они всегда возвращают каждое отдельное отношение в модели User.

Даже если я попытаюсь User::find($user_id);, он все равно вернет все отношения.

Кто-нибудь знает, что здесь происходит?

Я использую Laravel 5.6 и PHP 7.2

1 Ответ

0 голосов
/ 16 мая 2018

Вы можете использовать свойство $hidden для удаления отношений из ответа:

protected $hidden = ['company', ...];

Вы также можете временно удалить отношения:

$user->addHidden('company');
...