我可以使用php artisan db:seed来播种相关表吗?

时间:2015-08-02 23:55:54

标签: php mysql laravel-5 artisan

是否可以使用Laravel 5中的以下内容对相关表进行播种?

php artisan db:seed

我有两张桌子

users 
    id
    first name

projects
    id
    name

和数据透视表

project_user
    project_id
    user_id

我想创建一些用户,一些项目,然后将用户及其各自的项目联系起来。

播种用户和项目不是问题,但我不知道如何处理数据透视表。

有可能吗?

1 个答案:

答案 0 :(得分:1)

当然可以。如果您正在使用Eloquent,您可以简单地处理正常关系(也许是最简单的方法)。或者,如果直接使用SQL构建器,则可以像平常一样提供表,但是您需要遵守外键规则。

试试看,你会看到。但请确保导入您使用的类。

在两个模型之间添加关系很容易,但是常见的关系类型(以及他的观点)之间存在一些差异:一对多,多对一和多对多。


一对多和多对一

假设您的每个项目都有一个创建者,即所有者,您可以在UserProject之间建立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));


许多对多

在您的情况下,我们需要UsersProjects之间的多对多关系。语法有点不同,但结果很直接。首先,我们需要两种模型之间的关系:

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([]));