Laravel 的 eloquent 关系和 MySQL 的外键 - belongsTo 不会产生关系
Laravel's eloquent relationships and MySQLs foreign keys - belongsTo not resulting in a relationship
我想我对 Laravel 的 eloquent 关系(版本 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
]
...
我的用户 table 是否需要 FK 引用帐户所有者? (因为 Laravel 的文档在 https://laravel.com/docs/7.x/eloquent-relationships#introduction 上提到了 return $this->hasOne('App\Phone', 'foreign_key');
。
或者我的问题是什么?
您必须使用帐户模型中的 'owner' 列
return $this->belongsTo(User::class, 'owner','id');
我想我对 Laravel 的 eloquent 关系(版本 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
]
...
我的用户 table 是否需要 FK 引用帐户所有者? (因为 Laravel 的文档在 https://laravel.com/docs/7.x/eloquent-relationships#introduction 上提到了 return $this->hasOne('App\Phone', 'foreign_key');
。
或者我的问题是什么?
您必须使用帐户模型中的 'owner' 列
return $this->belongsTo(User::class, 'owner','id');