Отношения Laravel One to Many не работают - возвращает рекурсию
Я разрабатываю приложение с Laravel 8, и я столкнулся с очень странным поведением.
У меня есть модель под названием «Организация», у этой организации много пользователей (модель от Jetstream).
Я сделал отношения как обычно:
В модели организации:
public function users()
{
return $this->hasMany(User::class);
}
В модели пользователя:
public function organisation()
{
return $this->belongsTo(Organisation::class);
}
У меня есть поле в таблице пользователей с именемorganisation_id, которое объявлено в миграции как таковое:
$table->foreignId('organisation_id')->nullable()->constrained();
Проверил БД, все заполнено, нулевых значений нет.
Ожидаемый результат: Если я позвоню
$testUser=User::find(1);
$testOrg=$testUser->organisation();
Я получу объект организации.
Фактический результат: я получаю объект журнала veeeeery, в котором указано что-то, включая RECURSION, вместо организации, которую я хочу. Это ошибка внешнего ключа? Модель User также имеет отношение ownToMany к другой модели. Является ли это способом стандартного ownTo?
ИЗМЕНИТЬ Я могу получить организацию при звонке
$testUser=User::with('organisation')->find(1);
Но это не тот чистый способ Laravel, с которым я хочу работать.
Я отладил запрос с помощью $ testOrg = $ testUser-> organization () ->toSql (); и он отобразил меня: строка (60) "выберите * откуда
organisations
.
id
знак равно
Итак, «где» неверно?
Любые подсказки или помощь будут очень признательны
Вот некоторые из результатов: (весь вывод слишком длинный)
NULL ["remember_token"]=> NULL ["current_team_id"]=> NULL["profile_photo_path"]=> NULL ["created_at"]=> NULL ["updated_at"]=>NULL ["organisation_id"]=> int(1) } ["changes":protected]=> array(0) {} ["classCastCache":protected]=> array(0) { } ["dates":protected]=>array(0) { } ["dateFormat":protected]=> NULL["dispatchesEvents":protected]=> array(0) { }["observables":protected]=> array(0) { } ["relations":protected]=>array(0) { } ["touches":protected]=> array(0) { } ["timestamps"]=>bool(true) ["visible":protected]=> array(0) { }["guarded":protected]=> array(1) { [0]=> string(1) "*" }["rememberTokenName":protected]=> string(14) "remember_token"["accessToken":protected]=> NULL } ["foreignKey":protected]=>string(15) "organisation_id" ["ownerKey":protected]=> string(2) "id"["relationName":protected]=> string(12) "organisation"["query":protected]=>object(Illuminate\Database\Eloquent\Builder)#1386 (8) {["query":protected]=> object(Illuminate\Database\Query\Builder)#1388(22) { ["connection"]=>object(Illuminate\Database\MySqlConnection)#1353 (18) {["pdo":protected]=> object(PDO)#1364 (0) { } ["readPdo":protected]=>NULL ["database":protected]=> string(7) "laravel"["tablePrefix":protected]=> string(0) "" ["config":protected]=>array(15) { ["driver"]=> string(5) "mysql" ["host"]=> string(9)"127.0.0.1" ["port"]=> string(4) "3306" ["database"]=> string(7)"laravel" ["username"]=> string(4) "root" ["password"]=> string(0) ""["unix_socket"]=> string(0) "" ["charset"]=> string(7) "utf8mb4"["collation"]=> string(18) "utf8mb4_unicode_ci" ["prefix"]=> string(0)"" ["prefix_indexes"]=> bool(true) ["strict"]=> bool(true)["engine"]=> NULL ["options"]=> array(0) { } ["name"]=> string(5)"mysql" } ["reconnector":protected]=> object(Closure)#132 (2) {["this"]=> object(Illuminate\Database\DatabaseManager)#40 (5) {["app":protected]=> object(Illuminate\Foundation\Application)#2 (35) {["basePath":protected]=> string(38)"C:\xampp\htdocs\wiederverkaufen-portal"["hasBeenBootstrapped":protected]=> bool(true) ["booted":protected]=>bool(true) ["bootingCallbacks":protected]=> array(2) { [0]=>object(Closure)#195 (2) { ["static"]=> array(1) { ["instance"]=>object(Illuminate\Queue\QueueServiceProvider)#189 (3) {["app":protected]=> RECURSION ["bootingCallbacks": protected] => array(0) {} ["bootedCallbacks": protected] => array(0) {}}}["this"]=> RECURSION } [1] => объект (закрытие ) #338 (2) {["static"] => массив (1) {["instance"] => объект (Illuminate\Cache\CacheServiceProvider)#332 (3) {["app": protected] => РЕКУРСИЯ ["bootingCallbacks": protected] => array(0) {} ["bootedCallbacks": protected] => array(0) {}}} ["this"]=> RECURSION }} ["bootedCallbacks": protected] = > array (1) {[0] => объект (Closure) # 340 (1) {["this"] => объект (App \ Providers \ RouteServiceProvider) # 164 (5) {["namespace": protected] = > NULL ["loadRoutesUsing":protected] => объект (Закрытие) # 341 (1) {["this"]=> RECURSION } ["app": protected] => RECURSION["bootingCallbacks": protected] => array(0) {} ["bootedCallbacks": protected] => array (1) {[0] => объект (Closure) # 165 (1) {["this"] = > RECURSION }}}}} ["terminatingCallbacks": protected] => массив (0) {} ["serviceProviders": protected] => массив (34) {[0] => объект (Illuminate\ Events \ EventServiceProvider) #6 (3) {["app": protected] => RECURSION ["bootingCallbacks": protected] => массив (0) {} ["bootedCallbacks": protected] => массив (0) {}} [1] = > объект (Illuminate\ Log \ LogServiceProvider) # 8 (3) {["app": protected] => РЕКУРСИЯ
1 ответ
Попробуй это:
$testUser=User::with('organisation')->find(1);
Если вы хотите продолжить свой путь, обновите его до этого:
$testUser=User::find(1);
$testOrg=$testUser->organisation;