我可以使用 php artisan db:seed 来为相关表设置种子吗?
Can I use php artisan db:seed to seed related tables?
是否可以在 Laravel 5 中使用以下内容播种相关的 table?
php artisan db:seed
我有两个table
users
id
first name
projects
id
name
和一个支点table
project_user
project_id
user_id
我想创建多个用户、多个项目,然后将用户与其各自的项目相关联。
播种用户和项目不是问题,但我不确定如何处理枢轴 table。
可能吗?
当然可以。如果您使用 Eloquent,您可以简单地使用正常关系(也许是最简单的方法)。或者,如果您直接使用 SQL 构建器,您可以照常提供 table,但您需要遵守外键规则。
只要试一试,您就会知道。但请确保您导入 类 您使用的
在两个模型之间添加关系很容易,但常见的关系类型(和他的观点)之间存在一些差异:一对多、多对一和多对多。
一对多和多对一
假设您的每个项目都有一个创建者,也就是所谓的所有者,您可以在 User
和 Project
之间建立 1:n 关系。
public class User {
public function ownedProjects() {
return $this->hasMany('App\Project');
}
}
public class Project {
public function owner() {
return $this->belongsTo('App\User');
}
}
在这种关系中,您可以将 Project
附加到 User
或告诉 Project
他的所有者是谁。
// Attach a project to an user
$project = Project::create([]);
User::find($id)->ownedProjects()->save($project);
// There is also a function saveMany() for an array of projects
// Tell the project who his owner is
$project = Project::create([]);
$project->owner()->associate(User::find($id));
多对多
在你的例子中,我们需要 Users
和 Projects
之间的多对多关系。语法有点不同,但结果非常直接。首先我们需要两个模型之间的关系:
public class User {
public function projects() {
return $this->belongsToMany('App\Project');
}
}
public class Project {
public function users() {
return $this->belongsToMany('App\User');
}
}
然后我们可以这样查询关系:
$project = Project::create([]);
User::find($id)->projects()->attach($project->id);
你也可以附加一大堆项目,从另一边做同样的事情,分离模型或同步它们,如果你想确保一个确切的数量(并且只有这个数量)是相关的:
// Adds a relation for the user to projects with ids 1, 2, 4 and 6
User::find($id)->projects()->attach([1, 2, 4, 6]);
// Adds the users with ids 19 and 173 to this project
Project::find($id)->users()->attach([19, 173]);
// Removes the user 19 from the projects relations
Project::find($id)->users()->detach(19);
// Removes all relations between this user and projects that are
// not listed in the synchronization array and adds a relation
// to all projects where none exists yet
User::find($id)->projects()->sync([4, 7, 19, 6, 38]);
这是多对多关系的正常语法,但您也可以像在一对多关系中一样附加模型:
// Creation of project could also be done before and saved to a variable
User::find($id)->projects()->save(Project::create([]));
是否可以在 Laravel 5 中使用以下内容播种相关的 table?
php artisan db:seed
我有两个table
users
id
first name
projects
id
name
和一个支点table
project_user
project_id
user_id
我想创建多个用户、多个项目,然后将用户与其各自的项目相关联。
播种用户和项目不是问题,但我不确定如何处理枢轴 table。
可能吗?
当然可以。如果您使用 Eloquent,您可以简单地使用正常关系(也许是最简单的方法)。或者,如果您直接使用 SQL 构建器,您可以照常提供 table,但您需要遵守外键规则。
只要试一试,您就会知道。但请确保您导入 类 您使用的
在两个模型之间添加关系很容易,但常见的关系类型(和他的观点)之间存在一些差异:一对多、多对一和多对多。
一对多和多对一
假设您的每个项目都有一个创建者,也就是所谓的所有者,您可以在 User
和 Project
之间建立 1:n 关系。
public class User {
public function ownedProjects() {
return $this->hasMany('App\Project');
}
}
public class Project {
public function owner() {
return $this->belongsTo('App\User');
}
}
在这种关系中,您可以将 Project
附加到 User
或告诉 Project
他的所有者是谁。
// Attach a project to an user
$project = Project::create([]);
User::find($id)->ownedProjects()->save($project);
// There is also a function saveMany() for an array of projects
// Tell the project who his owner is
$project = Project::create([]);
$project->owner()->associate(User::find($id));
多对多
在你的例子中,我们需要 Users
和 Projects
之间的多对多关系。语法有点不同,但结果非常直接。首先我们需要两个模型之间的关系:
public class User {
public function projects() {
return $this->belongsToMany('App\Project');
}
}
public class Project {
public function users() {
return $this->belongsToMany('App\User');
}
}
然后我们可以这样查询关系:
$project = Project::create([]);
User::find($id)->projects()->attach($project->id);
你也可以附加一大堆项目,从另一边做同样的事情,分离模型或同步它们,如果你想确保一个确切的数量(并且只有这个数量)是相关的:
// Adds a relation for the user to projects with ids 1, 2, 4 and 6
User::find($id)->projects()->attach([1, 2, 4, 6]);
// Adds the users with ids 19 and 173 to this project
Project::find($id)->users()->attach([19, 173]);
// Removes the user 19 from the projects relations
Project::find($id)->users()->detach(19);
// Removes all relations between this user and projects that are
// not listed in the synchronization array and adds a relation
// to all projects where none exists yet
User::find($id)->projects()->sync([4, 7, 19, 6, 38]);
这是多对多关系的正常语法,但您也可以像在一对多关系中一样附加模型:
// Creation of project could also be done before and saved to a variable
User::find($id)->projects()->save(Project::create([]));