Laravel归属关系返回空值

问题描述 投票:0回答:2

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

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

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

我怀疑它与用户模型中的belongsTo关系有关,但奇怪的是,即使使用users,它实际上也会在使用该关系时创建并保留一个新的SubscriptionAccount(上面的第二行)。来自新的SubscriptionAccount的关系,它也返回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');
    }
}

唯一不同寻常的是将关系的名称从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,但反之则不起作用。

laravel has-many belongs-to eloquent--relationship
2个回答
0
投票

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

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

如果您在belongTo表中有一个user_id,它将subscription_accounts个用户。

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


0
投票

这是与belongsTo关系的已知问题(特征?):

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

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

$user = User::find(1);
$sub = Subscription::create(['name' => 'Test Subscription']);
$user->subscription()->associate($sub);
$user->save();
© www.soinside.com 2019 - 2024. All rights reserved.