Попытка прочитать свойство «id» в null laravel 8

#php #laravel-8

#php #laravel-8

Вопрос:

Кто-нибудь может мне помочь? У меня ошибка при попытке прочитать свойство «id» в null Laravel 8 при попытке показать мою таблицу

Таблицы миграции

 Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('username', 20)->unique();
            $table->string('password', 20);
            $table->enum('level',['admin', 'manager', 'pegawai']);
            $table->timestamps();
        });

Schema::create('employees', function (Blueprint $table) {
            $table->id();
            $table->foreignId('id_user')
                ->constrained('users')
                ->onUpdate('cascade')
                ->onDelete('cascade');
            $table->string('nama_pgw', 50);
            $table->string('alamat');
            $table->string('no_telp', 13);
            $table->string('email', 30)->unique;
            $table->timestamps();

        });
 

Модель сотрудника

 namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Employee extends Model
{
    use HasFactory;
    protected $table = 'employees';
    protected $fillable = ['nama_pgw', 'username', 'alamat', 'no_telp', 'email'];

    public function user(){
        return $this->hasOne(User::class); 
    }
}
 

Пользовательская модель

 namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class User extends Model
{
    use HasFactory;
    protected $table = 'users';
    protected $fillable = ['username', 'password', 'level'];

    public function employee(){
        return $this->belongsTo(Employee::class, 'id_user', 'id');
    }
}
 

Пользовательский контроллер

 namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateSupportFacadesDB;
use AppModelsUser;

class UserController extends Controller
{

    public function index()
    {

        $users = User::get();
        return view('user/index', compact('users'));
        
    }
}
 

Контроллер сотрудника

 namespace AppHttpControllers;

use IlluminateHttpRequest;
use IlluminateSupportFacadesDB;
use AppModelsEmployee;
use AppModelsUser;

class PegawaiController extends Controller
{
    
    public function index()
    {

        $pegawai = Employee::get();
        return view('pegawai/index', compact('pegawai'));

    }
}
 

Это мое мнение

 <select name="id_user" id="username" class="uk-select">
    <option>- pilih username -</option>
        @foreach ($pegawai as $emp)
           option value="{{$emp->users->id}}">{{$emp->users->nama_pgw}}</option>
        @endforeach
</select>
 

Есть ли какие-либо проблемы с внешним ключом? Я продолжаю проверять возможность опечаток, но все кажется правильным.
Спасибо!

Комментарии:

1. вам нужно провести рефакторинг вашего кода, возможно, некоторые ошибки с опечатками и убедиться, что вы пытаетесь сделать с $ emp-> users ..??? где вы это определяете?

2. @Prospero $ emp определил $ pegawai на моем контроллере Employee для пользователей как таблицу внешних ключей.

3. Что вы пытались отладить проблему?

Ответ №1:

Ваше отношение в модели employee — «пользователь», в то время как вы ссылаетесь на него в блейд-представлении как «пользователи».

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

 <select name="id_user" id="username" class="uk-select">
    <option>- pilih username -</option>
        @foreach ($pegawai as $emp)
           <option value="{{$emp->user->id}}">{{$emp->user->nama_pgw}}</option>
        @endforeach
</select>
 

Отредактировано:

Я также предложу оптимизировать ваш запрос с помощью быстрой загрузки. В вашем текущем коде он выполнит n 1 запросов, где 1 запрос для извлечения сотрудников и N запросов для извлечения пользователя для каждого сотрудника

Обновите его с помощью приведенного ниже кода:

 class PegawaiController extends Controller
{
    
    public function index()
    {

        $pegawai = Employee::with(['user'])->get();
        return view('pegawai/index', compact('pegawai'));

    }
}
 

Комментарии:

1. Это работает! Я думал, что «пользователи» в представлении блейда ссылаются на имя таблицы. Мне все еще нужно узнать больше. Спасибо!

2. @RadenBagus обновил мой ответ. Вы также можете оптимизировать его.