Нерекурсивный метод toArray() в LaravelPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Нерекурсивный метод toArray() в Laravel

Сообщение Anonymous »

Пытаюсь установить связи hasMany() и hasOne() между двумя таблицами, как я делал раньше.

Я иметь модель Account, которая имеет как user() (один-ко-многим), так и superUser() (один-к-одному), оба из которых хранятся во встроенном -в модели User. Как и в случае обычных связей «один ко многим», таблица «многие» () сохраняет связь с «один», но для связи «один к одному» я сохраняю связь в таблице учетных записей.

Аккаунты:

Код: Выделить всё

/* model */
public function superUser()
{
return $this->hasOne(User::class, 'id', 'superuser_id');
}

public function users()
{
return $this->hasMany(User::class);
}

/* migration */
public function up()
{
Schema::create('accounts', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('superuser_id')->unsigned();
$table->string('name');
$table->timestamps();

$table->foreign('superuser_id')
->references('id')
->on('users')
->onDelete('cascade');
});
}
Пользователи

Код: Выделить всё

/* model */
public function account()
{
return $this->belongsTo(Account::class);
}

/* migration */
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('account_id')->unsigned()->index()->nullable();
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
Проверка связей

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

< pre class="lang-php Prettyprint-override">

Код: Выделить всё

>>> $user = factory(App\User::class)->create()
=> App\User {#3014
name: "Rose Grant II",
email: "ernser.thomas@example.com",
email_verified_at: "2019-05-31 15:38:32",
updated_at: "2019-05-31 15:38:32",
created_at: "2019-05-31 15:38:32",
id: 23,
}
Создайте учетную запись с $user в качестве суперпользователя:

Код: Выделить всё

>>> $account = factory(App\Account::class)->create(['superuser_id' => $user]);
=> App\Account {#3024
name: "Kuhic-Price",
superuser_id: 23,
updated_at: "2019-05-31 15:39:11",
created_at: "2019-05-31 15:39:11",
id: 17,
}
>>> $account->superUser
=> App\User {#3011
id: 23,
account_id: null,
name: "Rose Grant II",
email: "ernser.thomas@example.com",
email_verified_at: "2019-05-31 15:38:32",
api_token: null,
created_at: "2019-05-31 15:38:32",
updated_at: "2019-05-31 15:38:32",
}

Код: Выделить всё

account_id
имеет значение null, поскольку мы еще не связали $user с учетной записью:

Код: Выделить всё

>>> $account->superUser->account()->associate($account)->save()
=> true
>>> $account->superUser
=> App\User {#3011
id: 23,
account_id: 17,
name: "Rose Grant II",
email: "ernser.thomas@example.com",
email_verified_at: "2019-05-31 15:38:32",
api_token: null,
created_at: "2019-05-31 15:38:32",
updated_at: "2019-05-31 15:43:55",
account: App\Account {#3024
name: "Kuhic-Price",
superuser_id: 23,
updated_at: "2019-05-31 15:39:11",
created_at: "2019-05-31 15:39:11",
id: 17,
superUser: App\User {#3011},
},
}
Но как только мы это сделаем, он зависает:

Код: Выделить всё

>>> $account->toArray()
^C
Я думаю, что это связано с тем, что каждая модель указывает на другую: суперпользователь учетной записи загружает пользователя, который загружает Аккаунт до бесконечности. Это ошибка в toArray() или просто нормальное поведение, на которое мне следует обратить внимание? Или я делаю это неправильно?


Подробнее здесь: https://stackoverflow.com/questions/563 ... ve-toarray
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»