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

}
}

如您所见,我试图通过两种方式来定义关系。

  1. 通过 ->subpages()->save($page2); 设置 hasMany;
  2. 通过 ->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();