Laravel ownTo отношение возвращает ноль - PullRequest
0 голосов
/ 03 октября 2019

Я создаю элементарное приложение CRM, используя Laravel 6.0. Пользователи могут свободно создавать учетные записи, но чтобы получить какую-либо функциональность из приложения, им необходимо настроить SubscriptionAccount (или присоединиться к существующему), который затем позволит им создавать / управлять учетными записями клиентов, добавлять пользователей и т. Д. (Каждый из них). это один ко многим).

Отношения модели пользователя с моделью SubscriptionAccount вызывают у меня проблемы. Например:

$user = User::find(1);
$user->subscription()->create(['name' => 'Test Subscription']);
$user = $user->fresh();
dd($user->subscription); // returns null

Я подозревал, что это связано с отношением belongsTo в модели User, но странным является то, что он фактически создает и сохраняет новый SubscriptionAccount при использовании этого отношения (вторая строкавыше), хотя, если вы получаете доступ к users отношению из нового SubscriptionAccount, он также возвращает ноль.

Вот модели:

// User.php
class User
{
    public function subscription()
    {
        return $this->belongsTo(SubscriptionAccount::class, 'subscription_account_id');
    }
}

// SubscriptionAccount.php
class SubscriptionAccount extends Model
{
    public function users()
    {
        return $this->hasMany(User::class, 'subscription_account_id');
    }
}

Единственное, что необычно, - это сокращениеимя отношения с subscription из SubscriptionAccount, но об этом нужно было позаботиться, указав внешний ключ в обоих отношениях. Вот миграции:

Schema::create('subscription_accounts', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->uuid('uuid')->unique();
    $table->string('name');
    $table->timestamps();
});

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->uuid('uuid')->unique();
    $table->bigInteger('subscription_account_id')->unsigned()->index()->nullable();
    $table->string('name');
    ...
    $table->timestamps();
    $table->foreign('subscription_account_id')
        ->references('id')
        ->on('subscription_accounts');
});

Если я создаю пользователя из SubscriptionAccount (т. Е. $subscriptionAccount->users()->create([...]);, он устанавливает правильный subscription_account_id в таблице users, но не работает наоборот.

Ответы [ 2 ]

2 голосов
/ 04 октября 2019

Это известная проблема (функция?) С отношением belongsTo:

https://github.com/laravel/framework/issues/29978

Чтобы обойти это, вы можете связать модели вручную:

$user = User::find(1);
$sub = Subscription::create(['name' => 'Test Subscription']);
$user->subscription()->associate($sub);
$user->save();
0 голосов
/ 04 октября 2019

Таким образом, вместо использования belongsTo, поскольку учетная запись подписки не принадлежит одному пользователю, она может принадлежать многим, вы можете вместо этого использовать отношение hasOne:

public function subscription()
{
    return $this->hasOne(SubscriptionAccount::class, 'id', 'subscription_account_id');
}

Это будетbelongTo один пользователь, если у вас есть user_id в таблице subscription_accounts.

Дайте мне знать, если это имеет смысл и работает ли оно:)

...