【发布时间】:2020-12-14 00:35:29
【问题描述】:
我认为我对 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 accounts.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');。
或者我的问题是什么?
【问题讨论】:
-
您必须在 Account 模型中使用 'owner' 列 return $this->belongsTo(User::class, 'owner','id');
-
@sohailansari 这实际上似乎起到了作用 oO 虽然我不确定这有什么意义。但我想我在理解关系方面遇到了问题。你会键入答案吗?我会接受的。