如何解决Laravel雄辩的关系和MySQL的外键
我认为我对Laravel雄辩的人际关系(版本7)有误解。
主要问题是:是否需要MySQL外键才能使其正常工作? FK是否同时需要这两个方向?
情况:我有用户,我有帐户。每个用户都有一个帐户,每个帐户都属于一个用户。
用户迁移:
class CreateUsersTable extends Migration
{
public function up()
{
Schema::create('users',function (Blueprint $table)
{
$table->id();
$table->string('name');
$table->string('email')->unique();
$table->string('password');
$table->rememberToken();
$table->timestamp('updated_at');
$table->timestamp('email_verified_at')->nullable();
$table->timestamp('created_at')->useCurrent();
});
}
}
帐户迁移:
class CreateAccountsTable extends Migration
{
public function up()
{
Schema::create('accounts',function (Blueprint $table)
{
$table->id('owner');
$table->bigInteger('currency');
$table->integer('currencyGenerators');
$table->foreign('owner')->references('id')->on('users');
$table->timestamp('updated_at');
$table->dateTime('lastResourceUpdate')->nullable()->useCurrent();
$table->timestamp('created_at')->useCurrent();
});
}
}
因此,我有一个MySQL FK account.owner引用了users.id。
用户模型:
class User extends Authenticatable
{
...
public function account(): HasOne
{
return $this->hasOne(Account::class,'owner');
}
}
帐户模型:
class Account extends Model
{
...
public function user(): BelongsTo
{
return $this->belongsTo(User::class,'id');
}
}
我可以检索用户的帐户:
$users = User::all();
dd($users[0]);
App\User {#1030 ▼
#primaryKey: "id"
...
#relations: array:1 [▼
"account" => App\Account {#1185 ▶}
]
...
但是我无法获得该帐户的用户:
$accounts = Account::all();
dd($accounts[0]);
App\Account {#1241 ▼
#primaryKey: "owner"
...
#relations: array:1 [▼
"user" => null
]
...
我的用户表中是否需要引用帐户所有者的FK? (因为Laravel的文档在https://laravel.com/docs/7.x/eloquent-relationships#introduction上提到了return $this->hasOne('App\Phone','foreign_key');
。
还是我的问题在这里?
解决方法
您必须在帐户模型中使用“所有者”列
return $this->belongsTo(User::class,'owner','id');
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。