Laravel includesTo关系返回null

时间:2019-10-03 20:30:23

标签: laravel has-many belongs-to eloquent--relationship

我正在使用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关系有关,但奇怪的是,尽管使用了该关系,但实际上它会在使用该关系时创建并保留一个新的SubscriptionAccount(上面的第二行)来自新SubscriptionAccount的users关系也会返回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,但反之亦然。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

因此,与其使用belongsTo(因为一个订阅帐户不属于一个用户,而是可以属于多个用户),不如使用hasOne关系:

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

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

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