Laravel 5.6環境での質問です。
実現したいこと
商品ページでそれに関連する別商品を表示するようなプログラムを実装したいです。
現状の実装
商品テーブルを元に、その商品同士の関連テーブルを定義しています。
下記の通り、Productモデルを関連商品を管理するテーブルで定義しています。
PHP
1Schema::create('product_relations', function (Blueprint $table) { 2 $table->unsignedBigInteger('product_id_1')->comment('商品ID_1'); 3 $table->foreign('product_id_1') 4 ->references('id')->on('products') 5 ->onUpdate('cascade') 6 ->onDelete('cascade'); 7 $table->unsignedBigInteger('product_id_2')->comment('商品ID_2'); 8 table->foreign('product_id_2') 9 ->references('id')->on('products') 10 ->onUpdate('cascade') 11 ->onDelete('cascade'); 12 $table->primary(['product_id_1', 'product_id_2']); 13 $table->timestamps(); 14});
発生している問題
Productモデルにおいて、product_relationsテーブルから
product_1をキーにproduct_2の商品と、
product_2をキーにproduct_1の商品を合わせた関連を定義したいですのですが、
SQLにてエラーが発生してしまいます。
イメージとしては下記のようなことを行いたいのですが、
モデルやテーブル設計がLaravelのガイドラインと合っていないのか、
関連の定義が誤っているのか、教えていただければ幸いです。
PHP
1public function relationProducts() { 2 return $this->belongsToMany(Product::class, 'product_relations', 'product_id_1', 'product_id_2') 3 ->unionAll($this->belongsToMany(Product::class, 'product_relations', 'product_id_2', 'product_id_1')); 4}
発生しているエラー
SQLSTATE[21000]: Cardinality violation: 1222 The used SELECT statements have a different number of columns (SQL: (select `products`.*, `product_relations`.`product_id_1` as `pivot_product_id_1`, `product_relations`.`product_id_2` as `pivot_product_id_2` from `products` inner join `product_relations` on `products`.`id` = `product_relations`.`product_id_2` where `product_relations`.`product_id_1` = 1) union all (select * from `products` inner join `product_relations` on `products`.`id` = `product_relations`.`product_id_1` where `product_relations`.`product_id_2` = 1))
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/05 18:36 編集
2019/08/06 02:58
2019/08/06 03:00
2019/08/06 04:41
2019/08/06 04:52
2019/08/06 05:00