我正在使用laravel将一些内容从远程WP数据库导入本地数据库。我已经设置了表的清单和内容。

库存表如下所示:

    Schema::create('inventories', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('remote_id')->unsigned();
        $table->integer('local_id')->unsigned();
        $table->string('local_type');
        $table->timestamps();

        $table->foreign('local_id')->references('id')->on('contents')->onDelete('cascade');
    });


这是内容表:

    Schema::create('contents', function (Blueprint $table) {
        $table->increments('id')->unsigned();
        $table->integer('ct_id')->unsigned();
        $table->foreign('ct_id')->references('id')->on('content_types');
        $table->integer('cms_id');
        $table->string('title');
        $table->string('slug');
        $table->text('excerpt');
        $table->mediumText('body');
        $table->string('password');
        $table->integer('parent_id');
        $table->timestamps();
    });


我已经完成了从远程WP DB导入所有内容和导入单个帖子的功能。这是所有帖子的导入:

public function all()
{
    $include      = array_diff($this->indexable, ['folder']);
    $publishedPostsIDs = $this->import($include);
    $this->deleteOldContent($publishedPostsIDs);
}

private function import($include)
{
    $posts             = Post::where('post_status', 'publish')->whereIn('post_type', $include)->get();
    foreach ($posts as $post) {
        $publishedPostsIDs[] = $post->ID;
        $this->contentInterface->updateOrCreateInventory($post->ID);
    }

    return $publishedPostsIDs;
}

public function updateOrCreateInventory($remoteId)
{
    $this->contentInterface->updateOrCreateInventory($remoteId);
}

private function deleteOldContent($publishedPostsIDs)
{
    $contentToDelete = Content::whereNotIn('cms_id', $publishedPostsIDs)->get();

    if (count($contentToDelete) > 0) {
        foreach ($contentToDelete as $content) {
            $content->delete();
        }
    }
}


因此,当我全部导入时,我只是转到了all函数的路径,并且所有来自远程WP DB的非帖子类型文件夹的帖子都被导入了。如果我想从远程数据库导入单个帖子,那么我有一条直接通向updateOrCreateInventory函数的路由。我还导入了类型文件夹的帖子,基本上与功能all相同。

public function folder()
{
    $include = ['folder'];
    $importResult = $this->import($include);

    return $importResult['imported'];
}


我的问题是,当我一次导入所有文件夹时,出现错误:


  Connection.php 729行中的QueryException:SQLSTATE [23000]:完整性
  约束违反:1452无法添加或更新子行:外部
  键约束失败(middletoninventories,CONSTRAINT
  inventories_local_id_foreign外键(local_id)参考
  contentsid)删除级联(SQL:插入inventories
  (remote_idupdated_atcreated_at)值(7512,2017-11-13
  15:33:17,2017-11-13 15:33:17))


但是,如果我尝试分别导入同一文件夹,或者更确切地说是同一文件夹类型的帖子,则不会出现任何错误,并且该帖子也已导入。那怎么可能?

最佳答案

$ this-> contentInterface会创建一个未指定“ local_id”字段的清单模型,但是外键是必需的。

查找创建库存模型的位置并提供有效的“ local_id”。

08-29 00:44