質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

655閲覧

Laravelで多対多のリレーションを設定したい

chibi144

総合スコア64

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/05/24 00:19

前提・実現したいこと

Laravelを使ってWEBアプリを作成中です。

利用者に野菜を選択してもらい、その野菜の分類に応じた画像と注釈を表示するアプリです。
画像は矢印つきで、後付で注釈とPDFへのリンクを入れています。

![イメージ説明

shape 表示する画像を決定するテーブル
※葉物野菜はA1~A7、根物野菜はB1~B5みたいな設定をしているテーブルがまた別にあります

shape_code(PK)shape_imageFile
A1A1.jpg
A2A2.jpg

position 画像のどこに説明群を配置するか、画像には何個の説明群が存在するかを決定するテーブル
※A1に配置するN個目の説明文群(A1-N)

position_code(PK)shape_codeposition_topposition_left
A1-1A1100px30px
A1-2A1120px300px
A1-3A11px300px

position_symptom 中間テーブル

id(PK)position_codesymptom_code
1A1-1F001
2A1-1F002
3A1-2F003

symptom 説明文テーブル

symptom_code(PK)textpdfFile
F001葉が虫に食べられるchugai.pdf
F002葉が変色するhensyoku.pdf
F003虫がいるmushi.pdf

もともとはposition_symptomテーブルを作っておらず、
positionテーブル内にコンマ区切りでsymptom_codeを入れていたのですが、
コードがやたらとややこしくなったため、
Laravelのリレーション機能を使うために新たに作成しました。

発生している問題・エラーメッセージ

コントローラーで以下のように書いてみたところ、エラーが発生します。
firstを使っても一緒でした。

php

1$tmp = \App\Models\position::where('shape_code', 'A1')->get(); 2foreach ( $tmp as $val ) { 3 print_r($val->symptoms); 4}
SQLSTATE[42S22]: Column not found: 1054 Unknown column 'symptoms.id' in 'on clause' (SQL: select `symptoms`.*, `position_symptom`.`position_code` as `pivot_position_code`, `position_symptom`.`symptom_code` as `pivot_symptom_code` from `symptoms` inner join `position_symptom` on `symptoms`.`id` = `position_symptom`.`symptom_code` where `position_symptom`.`position_code` is null)

該当のソースコード

App/Models/position.php

php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Model; 6 7class position extends Model 8{ 9 protected $primarykey = 'position_code'; 10 public $incrementing = false; 11 12 public function symptoms() 13 { 14 return $this->belongsToMany('App\Models\symptom', 'position_symptom', 'position_code', 'symptom_code'); 15 } 16 17}

App/Models/symptom.php

php

1<?php 2 3namespace App\Models; 4 5use Illuminate\Database\Eloquent\Model; 6 7class symptom extends Model 8{ 9 protected $primarykey = "symptom_code"; 10 public $incrementing = false; 11 12 public function positions() 13 { 14 return $this->belongsToMany('App\Models\position', 'position_symptom', 'symptom_code', 'position_code'); 15 } 16 17}

試したこと

position_symptomモデルを作ってみたり、pivotを継承してみたりしましたが、何も変わりませんでした。

補足情報(FW/ツールのバージョンなど)

PHP 7.2.3
MariaDB 10.1.31
Laravel 5.6.3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

モデルの主キー指定が上手くいってないように見えます。
それぞれのモデルについて

protected $primarykey = "〇〇";

protected $primaryKey = "〇〇";

(key=>KeyでKを大文字にする)
Laravel5 Eloquentで、主キーを"id"カラムにしない設定
としてみてどうでしょうか

投稿2018/05/24 03:15

balaenoptera

総合スコア222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chibi144

2018/05/24 04:07

解決しました。 一対一、一対多のリレーションは小文字での指定で成功していたのもあって、完全に意識から外していました。まさかでした。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問