我正在使用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
,但反之则不起作用。
所以不要使用belongsTo
,因为订阅帐户不属于一个用户,它可以属于多个用户,您可能想改用hasOne
关系:
public function subscription()
{
return $this->hasOne(SubscriptionAccount::class, 'id', 'subscription_account_id');
}
如果您在belongTo
表中有一个user_id
,它将subscription_accounts
个用户。
让我知道它是否有意义以及是否有效:)
这是与belongsTo
关系的已知问题(特征?):
https://github.com/laravel/framework/issues/29978
要解决此问题,您可以手动关联模型:
$user = User::find(1);
$sub = Subscription::create(['name' => 'Test Subscription']);
$user->subscription()->associate($sub);
$user->save();