Laravel 5.7 получить текущего вошедшего в систему пользователя с профилем пользователя на один-один отношения

Я сейчас учусь Laravel 5.7, Я скачал исходный код с GitHub. В этом коде я реализовал отношения один к одному с таблицей пользователей и профилей.

Я был в состоянии успешно войти в систему пользователя и смог зарегистрировать пользователя. Тем не менее, когда я вызываю метод getCurrentUser() он возвращает данные только из пользовательской таблицы, а не из профиля.

User Model

class AuthController extends Controller
{
    public function __construct()
   {
     $this->middleware('auth:api')->only('logout');
   }
   public function getCurrentUser(): User
   {
     return request()->user();
   }
    public function login(Request $request): JsonResponse
   {
    $credentials = $this->validate($request, [
        'email'    => 'required|email|exists:users',
        'password' => 'required|min:5',
    ]);

    if (auth()->attempt($credentials)) {
        $user = auth()->user();
        /** @var User $user */
        $user['token'] = $this->generateTokenForUser($user);

        return response()->json($user);
    } else {
        return response()->json(['success' => 'false', 'message' => 'Authentication failed'], 401);
    }
 }

}

User

class User extends Authenticatable
{
    use Notifiable, HasApiTokens;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'first_name','last_name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];

    /**
     * Encrypt the password while savinf it.
     *
     * @param string $password
     */
    public function setPasswordAttribute(string $password)
    {
        $this->attributes['password'] = Hash::make($password);
    }
    public function User()
    {
        return $this->hasOne('App\UserProfile');
    }

}

User Profile

class UserProfile extends Model
{
    //
        /**
     * The following fields are mass assignable.
     * @var array
     */
    protected $fillable = ['first_name', 'last_name', 
    'middle_name', 'date_of_birth', 'nationality','phone','image','permanent_address_country',
    'permanent_address_state','permanent_address_district','temp_address_district','temp_address_state','gender','user_id'];

    public function UserProfile()
    {
        return $this->belongsTo('App\User');
    }
}

Как я могу вернуть текущего зарегистрированного пользователя и данные профиля через AuthgetCurrentUser апи?

я использую Vue.js на моей стороне клиента.

1 ответ

Решение

В вашем User модель, изменить User() метод к этому:

public function userProfile()
{
    return $this->hasOne('App\UserProfile');
}

И в твоем UserProfile модель, изменить UserProfile() метод к этому:

public function user()
{
    return $this->belongsTo('App\User');
}

Тогда вы можете получить свой пользователь с его профилем с этим запросом:

User::with('userProfile')->find(Auth::id()); 

В вашем случае вы можете рефакторинг getCurrentUser() метод к этому:

use Illuminate\Http\Request;

public function getCurrentUser(Request $request): User
{
    return $request->user()->load('userProfile');
}
Другие вопросы по тегам