加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – Laravel 4.2多对多关系,使用其他东西然后默认ID

发布时间:2020-12-14 19:39:23 所属栏目:大数据 来源:网络整理
导读:我有两个模型,他们都没有使用表中的ID,但字段internal_id.所以我定制了我的枢轴架构,但我一直坚持连接它们.我得到错误: General error: 1215 Cannot add foreign key constraint (SQL: alter table `SEOshop_category_product` add constraint SEOshop_cate
我有两个模型,他们都没有使用表中的ID,但字段internal_id.所以我定制了我的枢轴架构,但我一直坚持连接它们.我得到错误:

General error: 1215 Cannot add foreign key constraint (SQL: alter table `SEOshop_category_product` add constraint SEOshop_category_product_category_id_foreign foreign key   
  (`category_id`) references `SEOshop_categories` (`internal_id`) on delete cascade)

迁移的代码是:

Schema::create('SEOshop_category_product',function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('category_id')->unsigned()->index();
            $table->foreign('category_id')->references('internal_id')->on('SEOshop_categories')->onDelete('cascade');
            $table->integer('product_id')->unsigned()->index();
            $table->foreign('product_id')->references('internal_id')->on('SEOshop_products')->onDelete('cascade');
            $table->timestamps();
        });

作为SEOshop_categories.internal_id的SEOshop_products.internal_id这两个字段都是现有的,列类型都是int(11).

谁能告诉我出了什么问题?

表SEOshop_categories和SEOshop_products的迁移

//SEOshop_products
public function up()
    {
        Schema::create('SEOshop_products',function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('shop_id');
            $table->integer('internal_id')->signed()->index();
            $table->integer('internal_variant_id');
            $table->string('visible');
            $table->string('tags');
            $table->timestamps();
        });
    }


//Table SEOshop_categories
public function up()
    {
        Schema::create('SEOshop_categories',function(Blueprint $table)
        {
            $table->increments('id');
            $table->integer('internal_id')->signed()->index();
            $table->datetime('SEOshop_created_at');
            $table->datetime('SEOshop_updated_at');
            $table->text('full_description');
            $table->timestamps();
        });
    }

好的,所以现在我已经创建了我的表,它的工作原理应该如何.我需要让我的产品有类别(多2个).所以我用

SEOshopProduct::find(1)->with('categories')->get();

在dd()之后,类别为空,我查看了我的查询如何调用它:

[8] array(3) {
["query"] "select `SEOshop_categories`.*,`SEOshop_category_product`.`product_id` as `pivot_product_id`,`SEOshop_category_product`.`category_id` as `pivot_category_id` from `SEOshop_categories` inner join `SEOshop_category_product` on `SEOshop_categories`.`id` = `SEOshop_category_product`.`category_id` where `SEOshop_category_product`.`product_id` in (?)"
["bindings"] array(1) {
[0] 8
}
["time"] 0.37
}

产品和类别的internal_id大于10.000,我在查询中看不到它.

我的模特:

产品:

public function categories(){
        return $this->belongsToMany('SEOshopCategory','SEOshop_category_product','product_id','category_id');
    }

分类:

public function products(){
        return $this->belongsToMany('SEOshopCategory','category_id','product_id');
    }

解决方法

要设置外键约束,字段定义需要完全匹配.但是,在这种情况下,SEOshop_category_product.category_id字段被定义为UNSIGNED INT,但引用的SEOshop_categories.internal_id字段被定义为SIGNED INT.对于您的产品的外键也是如此.

因此,您可以将类别和产品表上的internal_id字段更新为未签名,也可以更新数据透视表上的外键字段以进行签名.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读