Laravel belongsTo关系返回null

Laravel belongsTo关系返回null,laravel,has-many,belongs-to,eloquent-relationship,Laravel,Has Many,Belongs To,Eloquent Relationship,我正在使用Laravel6.0构建一个基本的CRM应用程序。用户可以自由创建帐户,但要从应用程序中获得任何功能,他们需要设置一个SubscriptionAccount(或加入一个现有帐户),这将允许他们创建/管理客户帐户、添加用户等(每个帐户都是一对多) 用户模型与SubscriptionAccount模型的关系给我带来了问题。例如: $user=user::find(1); $user->subscription()->创建(['name'=>'testsubscription']); $us

我正在使用Laravel6.0构建一个基本的CRM应用程序。用户可以自由创建帐户,但要从应用程序中获得任何功能,他们需要设置一个SubscriptionAccount(或加入一个现有帐户),这将允许他们创建/管理客户帐户、添加用户等(每个帐户都是一对多)

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

$user=user::find(1);
$user->subscription()->创建(['name'=>'testsubscription']);
$user=$user->fresh();
dd($user->subscription);//返回空值
我怀疑它与用户模型中的
belongsTo
关系有关,但奇怪的是,它实际上在使用该关系(上面第二行)时创建并持久化了一个新的SubscriptionAccount,尽管如果从新的SubscriptionAccount访问
users
关系,它也会返回null

以下是模型:

//User.php
类用户
{
公共功能订阅()
{
返回$this->belongsTo(SubscriptionAccount::class,“subscription\u account\u id”);
}
}
//SubscriptionAccount.php
类SubscriptionAccount扩展模型
{
公共功能用户()
{
返回$this->hasMany(用户::类,'subscription\u account\u id');
}
}
唯一不寻常的事情是将关系的名称从
SubscriptionAccount
缩短为
subscription
,但这应该通过在两个关系中指定外键来解决。以下是迁移:

Schema::create('subscription\u accounts',函数(Blueprint$表){
$table->bigIncrements('id');
$table->uuid('uuid')->unique();
$table->string('name');
$table->timestamps();
});
Schema::create('users',函数(Blueprint$表){
$table->bigIncrements('id');
$table->uuid('uuid')->unique();
$table->bigInteger('subscription\u account\u id')->unsigned()->index()->nullable();
$table->string('name');
...
$table->timestamps();
$table->foreign('subscription\u account\u id')
->引用('id')
->关于(“认购账户”);
});

如果我从SubscriptionAccount创建用户(即,
$SubscriptionAccount->users()->create([…])
它在
用户
表上设置了正确的
订阅账户id
,但反过来不起作用。

因此,与其使用
belongsTo
订阅账户,不如使用
hasOne
关系,因为订阅账户不属于一个用户,它可以属于多个用户:

public function subscription()
{
    return $this->hasOne(SubscriptionAccount::class, 'id', 'subscription_account_id');
}
如果您在
subscription\u accounts
表中有
User\u id
,它将
属于一个用户

让我知道它是否合理,是否有效:)

这是一个已知的问题(功能?),与
的关系如下:

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

$user=user::find(1);
$sub=订阅::创建(['name'=>'testsubscription']);
$user->subscription()->associate($sub);
$user->save();

我同意一个用户只能拥有/属于一个订阅帐户,但一个订阅帐户也可以有多个用户,因此在这里颠倒关系是没有意义的。我认为这种关系类型是正确的,只是不知道为什么它不起作用。拥有和归属并不意味着相同,我的朋友。试试我的方法,不会有什么坏处:)谢谢你的建议——我确实更新了关系,结果破坏了我五分之一的单元测试如果使用null但不使用有效关系,则测试会很糟糕:Dnearly所有失败的测试都是500个服务器错误的结果。拉威尔很难处理错误的关系类型。这正是问题所在。我一直将其用作“通过”现有关系保存相关模型的参考。我猜我假设它与
create
一起工作。特别是考虑到示例代码使用了
belongsTo
关系。是的,文档在从父级连接到子级时使用
save()
create()
,在从子级连接到父级时使用
associate()
。无论谁投了反对票,请告诉我如何改进问题。