【发布时间】:2019-04-17 18:18:23
【问题描述】:
我有两个模型,文章和项目。 project 可以有很多相关的文章,一篇文章可以属于一个项目,也可以不属于一个项目。我有两个播种机 projectseeder 和 articleseeder。文章播种器首先被调用并且运行良好,然后我尝试在项目播种器中运行一个 for 循环来关联一些随机文章,结果只有一篇文章被添加到集合中。奇怪的是,添加的文章与项目具有相同的 ID,即如果项目 ID 为 1,则关联的文章 ID 也是 1。我不知道为什么项目播种器中的 for 循环没有按预期工作。
class Article extends Model{
//An Article can only belong to one project or it could be independent of project
public function project()
{
return $this->belongsToMany('App\Models\Project', 'id');
}
class Project extends Model
{
public function articles()
{
return $this->hasMany('App\Models\Article', 'id', 'id');
}
}
还有我的工厂和播种机
$factory->define(Article::class, function (Faker $faker) {
return [
'title' => $faker->sentence(rand(1,2)),
'short_text' => $faker->sentence(rand(3,5)),
'content' => $faker->paragraph(10),
'is_featured' => $faker->randomElement(['Y','N']),
'posted_by' =>'John Smith'
];
});
class ProjectTableSeeder extends Seeder
{
public function run()
{
Eloquent::unguard();
//select random articles for project
factory(App\Models\Project::class, 10)->create()
->each(function($project){
//associate 3 random article with this project
for ($i=0; $i <4 ; $i++) {
$project->articles->add(Article::find(rand(1,50))->get());
}//end for
}//end each function
);
Eloquent::reguard();
}
}
我死掉了关系,但我只得到一个文章实例。请帮我找出我做错了什么!提前感谢您的帮助。
更新#1: 这些是模型的迁移文件
Schema::create('articles', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
$table->string('title');
$table->text('short_text'); // Mandetory first 150 chars of content
$table->text('content');
$table->char('is_featured'); // Y for N for No
$table->string('posted_by'); // Auth user
});
Schema::create('projects', function (Blueprint $table) {
$table->bigIncrements('id');
$table->timestamps();
$table->text('title');
});
更新#2:
非常感谢您的回答。我很惊讶您实际上创建了一个完整的项目来回答我的问题!!!你真好,我真的很欣赏你的精神。您的解决方案就像一个魅力。
我不知道这是否会要求太多,但这是我要求的最后帮助。 所有 10 个项目都有相同的相关文章,即从文章 0 到 5。我希望选择随机文章,而不是所有项目都有相同的文章。
更新#3 我想出了一个不同的方法并改变了工厂方法
$factory->define(Article::class, function (Faker $faker) {
return [
'title' => $faker->sentence(rand(1,2)),
'short_text' => $faker->sentence(rand(3,5)),
'content' => $faker->paragraph(10),
'is_featured' => $faker->randomElement(['Y','N']),
'posted_by' =>'John Smith',
'project_id' =>$faker->randomElement([null,rand(1,10)]),
];
});
现在文章要么将项目的空值或随机 ID 作为项目 ID,而且文章现在自动与项目相关联。尽管如此,还是非常感谢您宝贵的时间。祝你有美好的一天。
【问题讨论】:
-
两张表中的每一个都有哪些列?最相关的是键列和外键列。
标签: laravel