Laravel v5.7 принадлежит не возвращает модель после установки Laravel Passport v7 - PullRequest
0 голосов
/ 11 октября 2018

Мой код работал нормально.После установки Laravel Passport v7 (последняя версия этой статьи и, кстати, я использую Laravel v5.7 и последнюю версию), мой код больше не работает.Когда я пытаюсь запустить $user->role->id, я получаю сообщение об ошибке

Попытка получить свойство 'id' не-объекта

Это потому, что мой $user->role этоне возвращает объект модели Role, но вместо этого он возвращает null, а перед установкой Laravel Passport он возвращает модель Role.Я не знаю, есть ли какие-либо связи, но я не хочу менять весь мой код из-за этого.Даже я пытался написать внутри своей модели User return $this->belongsTo(Role::class, 'role_id');, но это также не работает.

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

namespace App;

use App\Role;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

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

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

    public function role()
    {
        return $this->belongsTo(Role::class);
    }
}

Режим роли:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Role extends Model
{
    public function user()
    {
        return $this->hasMany(User::class);
    }
}

Схема таблицы пользователя:

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email', 250)->unique();
    $table->string('password');
    $table->string('phone', 11)->nullable();
    $table->integer('role_id')->unsigned()->default(1);
    $table->string('api_token', 60)->unique();
    $table->rememberToken();
    $table->timestamps();
});

Схема таблицы роли:

Schema::create('roles', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->timestamps();
});

HomeController:

<?php

namespace App\Http\Controllers;

use App\Product;
use Illuminate\Http\Request;

class HomeController extends Controller
{
    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    /**
     * Show the application dashboard.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $user = \Auth::user();

        $products = new Product;

        // here i am getting the error
        if ($user->role_id > 2) {
            $products = Product::where('name', '!=', NULL)->latest()->paginate(6);
        } else {
            $products = $products->getApprovedAndUntaken();
        }

        return view('welcome', compact('products'));
    }

    public function home()
    {
        return view('home');
    }
}

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Полагаю, ошибка связана с неверно настроенным Auth Guard в config/auth.php.

Перейдите и проверьте, выглядит ли ваш массив следующим образом после установки паспорта:

config / auth.php

 'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport', // Passport goes here
        'provider' => 'users',
    ],
],

В любое времяЕсли вы хотите получить доступ к связанному объекту, вы должны получить к нему доступ, например,

$user->object()

, а не

$user->object

Пожалуйста, дайте мне сейчас, если это работает для вас!

0 голосов
/ 11 октября 2018

используйте with метод для получения данных соединения

$products = Product::where('name', '!=', NULL)->with('role')->get()->paginate(6);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...