Laravel belongsTo 关系 returns 空

Laravel belongsTo relationship returns null

我正在使用 Laravel 6.0 构建一个基本的 CRM 应用程序。用户可以自由创建帐户,但要从应用程序中获得任何功能,他们需要设置一个 SubscriptionAccount(或加入现有帐户),然后他们才能 create/manage 客户帐户、添加用户等。 (每个都是一对多)。

User 模型与 SubscriptionAccount 模型的关系给我带来了问题。例如:

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

我怀疑它与 User 模型中的 belongsTo 关系有关,但奇怪的是它在使用该关系时实际上创建并保留了一个新的 SubscriptionAccount(上面的第二行),尽管如果您从新的 SubscriptionAccount 访问 users 关系它也 returns null.

以下是模型:

// 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');
    }
}

唯一不同寻常的是将关系的名称从 SubscriptionAccount 缩短为 subscription,但这应该通过在两个关系中指定外键来解决。这是迁移:

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([...]);,它会在 users table 上设置正确的 subscription_account_id,但反之则不起作用。

所以不要使用 belongsTo 因为订阅帐户不属于一个用户,它可以属于多个用户,您可能想使用 hasOne 关系:

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

如果您在 subscription_accounts table.

中有 user_id 个用户,它将 belongTo 一个用户

让我知道它是否有意义以及是否有效:)

这是 belongsTo 关系的已知问题(功能?):

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

要解决此问题,您可以手动关联模型:

$user = User::find(1);
$sub = Subscription::create(['name' => 'Test Subscription']);
$user->subscription()->associate($sub);
$user->save();