我正在使用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
,但反之亦然。
答案 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
个用户。
让我知道它是否有意义以及是否可行:)