Laravel belongsTo 关系 returns 空
Laravel belongsTo relationship returns null
我正在使用 Laravel 6.0 构建一个基本的 CRM 应用程序。用户可以自由创建帐户,但要从应用程序中获得任何功能,他们需要设置一个 SubscriptionAccount(或加入现有帐户),然后他们才能 create/manage 客户帐户、添加用户等。 (每个都是一对多)。
User 模型与 SubscriptionAccount 模型的关系给我带来了问题。例如:
$user = User::find(1);
$user->subscription()->create(['name' => 'Test Subscription']);
$user = $user->fresh();
dd($user->subscription); // returns null
我怀疑它与 User 模型中的 belongsTo
关系有关,但奇怪的是它在使用该关系时实际上创建并保留了一个新的 SubscriptionAccount(上面的第二行),尽管如果您从新的 SubscriptionAccount 访问 users
关系它也 returns 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');
}
}
唯一不同寻常的是将关系的名称从 SubscriptionAccount
缩短为 subscription
,但这应该通过在两个关系中指定外键来解决。这是迁移:
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([...]);
,它会在 users
table 上设置正确的 subscription_account_id
,但反之则不起作用。
所以不要使用 belongsTo
因为订阅帐户不属于一个用户,它可以属于多个用户,您可能想使用 hasOne
关系:
public function subscription()
{
return $this->hasOne(SubscriptionAccount::class, 'id', 'subscription_account_id');
}
如果您在 subscription_accounts
table.
中有 user_id
个用户,它将 belongTo
一个用户
让我知道它是否有意义以及是否有效:)
这是 belongsTo
关系的已知问题(功能?):
https://github.com/laravel/framework/issues/29978
要解决此问题,您可以手动关联模型:
$user = User::find(1);
$sub = Subscription::create(['name' => 'Test Subscription']);
$user->subscription()->associate($sub);
$user->save();
我正在使用 Laravel 6.0 构建一个基本的 CRM 应用程序。用户可以自由创建帐户,但要从应用程序中获得任何功能,他们需要设置一个 SubscriptionAccount(或加入现有帐户),然后他们才能 create/manage 客户帐户、添加用户等。 (每个都是一对多)。
User 模型与 SubscriptionAccount 模型的关系给我带来了问题。例如:
$user = User::find(1);
$user->subscription()->create(['name' => 'Test Subscription']);
$user = $user->fresh();
dd($user->subscription); // returns null
我怀疑它与 User 模型中的 belongsTo
关系有关,但奇怪的是它在使用该关系时实际上创建并保留了一个新的 SubscriptionAccount(上面的第二行),尽管如果您从新的 SubscriptionAccount 访问 users
关系它也 returns 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');
}
}
唯一不同寻常的是将关系的名称从 SubscriptionAccount
缩短为 subscription
,但这应该通过在两个关系中指定外键来解决。这是迁移:
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([...]);
,它会在 users
table 上设置正确的 subscription_account_id
,但反之则不起作用。
所以不要使用 belongsTo
因为订阅帐户不属于一个用户,它可以属于多个用户,您可能想使用 hasOne
关系:
public function subscription()
{
return $this->hasOne(SubscriptionAccount::class, 'id', 'subscription_account_id');
}
如果您在 subscription_accounts
table.
user_id
个用户,它将 belongTo
一个用户
让我知道它是否有意义以及是否有效:)
这是 belongsTo
关系的已知问题(功能?):
https://github.com/laravel/framework/issues/29978
要解决此问题,您可以手动关联模型:
$user = User::find(1);
$sub = Subscription::create(['name' => 'Test Subscription']);
$user->subscription()->associate($sub);
$user->save();