Laravel 5.1 - 使用自定义键的一对多
Laravel 5.1 - One To Many with custom key
我正在尝试在最新的 laravel-homestead 上使用 Laravel 5 在同一 class 的两个实例之间创建一对多关系。但是,出于某种原因 laravel 没有保存任何持久性关系。
这是我的 eloquent-型号 class:
class Page extends Model
{
//relationship
public function subpages()
{
return $this->hasMany('Ordiweb\Page','motherpage','pagename');
}
public function motherpage()
{
return $this->belongsTo('Ordiweb\Page','motherpage','pagename');
}
//table-name
protected $table = 'pages';
protected $primaryKey = 'pagename';
protected $timestamps = false;
//fillable attributes
protected $fillable = ['pagename','pagetitle','pagecontent','boxcontent'];
}
所以一个页面可以是0..n个子页面的母页。母页和子页都是Page-class.
的实例
我不完全确定 belongsTo() 和 hasMany() 中的 foreignKey ('motherpage') 和 localKey ('pagename') 参数,但 laravel 文档确实没有解释它们是如何使用的。但是,当我 运行 我的迁移时,我没有收到任何错误,所以我想这是正确的方式。
这是我对应的迁移-class:
class CreatePagesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('pages', function (Blueprint $table) {
$table->string('pagename');
$table->string('motherpage')->nullable();
$table->string('pagetitle')->nullable();
$table->text('content')->nullable();
$table->text('boxContent')->nullable();
$table->primary('pagename');
$table->foreign('motherpage')->references('pagename')->on('pages')->onUpdate('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('pages');
}
}
这是我的分页表播种器:
class PageTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('pages')->delete();
$page = new Page();
$page->pagename = 'testpage';
$page->pagetitle = 'Testpage Title';
$page->content = '<h3>Hello</h3>';
$page->save();
$page2 = new Page();
$page2->pagename = 'testpage2';
$page2->pagetitle = 'Testpage2 Title';
$page2->content = '<h3>Hello 2</h3>';
$page2->boxcontent = 'Test in the box.';
$page2->save();
$page->subpages()->save($page2);
$page2->motherpage()->associate($page);
$page->save();
$page2->save();
}
}
如您所见,我试图通过两种方式来定义关系。
- 通过 ->subpages()->save($page2); 设置 hasMany;
- 通过 ->motherpage()->associate($page); 设置反向 hasMany;
当 运行ning: "artisan migrate:refresh --seed" 似乎一切正常,没有错误消息出现。除了关系数据之外,所有定义的具有属性的模型都保存到持久性中。只有关系字段保持为空。
正如您在图片中看到的,"testpage2" 的母页字段应该是 "testpage" 而不是 NULL
真不知道以后要做什么。一切似乎都设置正确,我哪里搞砸了?
解决了!
通过查看数据库日志我发现 eloquent 模型被正确写入数据库后(包括 pagename
主键),由于某种原因 pagename
属性seeder-class 中的模型实例被设置为“0”。通过从 DB BEFORE 设置关系中重新检索模型实例,我修复了它。
$page = Page::find('testpage');
$page2 = Page::find('testpage2');
$page->subpages()->save($page2);
$page2->motherpage()->associate($page);
$page2->save();
我正在尝试在最新的 laravel-homestead 上使用 Laravel 5 在同一 class 的两个实例之间创建一对多关系。但是,出于某种原因 laravel 没有保存任何持久性关系。
这是我的 eloquent-型号 class:
class Page extends Model
{
//relationship
public function subpages()
{
return $this->hasMany('Ordiweb\Page','motherpage','pagename');
}
public function motherpage()
{
return $this->belongsTo('Ordiweb\Page','motherpage','pagename');
}
//table-name
protected $table = 'pages';
protected $primaryKey = 'pagename';
protected $timestamps = false;
//fillable attributes
protected $fillable = ['pagename','pagetitle','pagecontent','boxcontent'];
}
所以一个页面可以是0..n个子页面的母页。母页和子页都是Page-class.
的实例我不完全确定 belongsTo() 和 hasMany() 中的 foreignKey ('motherpage') 和 localKey ('pagename') 参数,但 laravel 文档确实没有解释它们是如何使用的。但是,当我 运行 我的迁移时,我没有收到任何错误,所以我想这是正确的方式。
这是我对应的迁移-class:
class CreatePagesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('pages', function (Blueprint $table) {
$table->string('pagename');
$table->string('motherpage')->nullable();
$table->string('pagetitle')->nullable();
$table->text('content')->nullable();
$table->text('boxContent')->nullable();
$table->primary('pagename');
$table->foreign('motherpage')->references('pagename')->on('pages')->onUpdate('cascade');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('pages');
}
}
这是我的分页表播种器:
class PageTableSeeder extends Seeder
{
/**
* Run the database seeds.
*
* @return void
*/
public function run()
{
DB::table('pages')->delete();
$page = new Page();
$page->pagename = 'testpage';
$page->pagetitle = 'Testpage Title';
$page->content = '<h3>Hello</h3>';
$page->save();
$page2 = new Page();
$page2->pagename = 'testpage2';
$page2->pagetitle = 'Testpage2 Title';
$page2->content = '<h3>Hello 2</h3>';
$page2->boxcontent = 'Test in the box.';
$page2->save();
$page->subpages()->save($page2);
$page2->motherpage()->associate($page);
$page->save();
$page2->save();
}
}
如您所见,我试图通过两种方式来定义关系。
- 通过 ->subpages()->save($page2); 设置 hasMany;
- 通过 ->motherpage()->associate($page); 设置反向 hasMany;
当 运行ning: "artisan migrate:refresh --seed" 似乎一切正常,没有错误消息出现。除了关系数据之外,所有定义的具有属性的模型都保存到持久性中。只有关系字段保持为空。
正如您在图片中看到的,"testpage2" 的母页字段应该是 "testpage" 而不是 NULL
真不知道以后要做什么。一切似乎都设置正确,我哪里搞砸了?
解决了!
通过查看数据库日志我发现 eloquent 模型被正确写入数据库后(包括 pagename
主键),由于某种原因 pagename
属性seeder-class 中的模型实例被设置为“0”。通过从 DB BEFORE 设置关系中重新检索模型实例,我修复了它。
$page = Page::find('testpage');
$page2 = Page::find('testpage2');
$page->subpages()->save($page2);
$page2->motherpage()->associate($page);
$page2->save();