Laravel:Viewのみだけど複合主キーを回避する方法
Laravel:Viewのみだけど複合主キーを回避する方法
以前の記事 Laravel:2つのカラムが一致するリレーションをしたい で2つのカラムのリレーションについて記載しました。その中で、Laravelでは基本的に推奨されていないため、回避する方法を考えるとまとめました。
今回もその流れの話となります。
お題は前回とほぼ同じ、商品分類である【カテゴリー】とモールの【タグコード】を紐づけます。
(前回は【ディレクトリー】との紐付けでした)
タグは数も多いし分類も複雑だし、何よりもモール間で被るタグコードがあったりします。
なので、【カートID】と【タグコード(配布されている値)】の2つの値でリレーションしなくてはなりません。
今回欲しいのもビューのみなので2値のリレーションをController側で取り出してみたいと思います。
ER図
コネクターは無茶苦茶ですが、簡単なER図です。

このうちの上部【タグ関連】の[cart_id]はシステム内のモールID、つまり楽天市場やYahooショッピングを区別するコードです。[tagcode]はモールから配布されたタグコード[carttaggroupcode]もモール側で管理されているタググループコードです。
単純にtagcodeだけのリレーションを組んだ場合、異なるモールで同じタグコードが存在する状況が発生すると本来抽出したい値と異なる値を生んでしまいます。
その為、cart_id + tagcode のリレーションが必要なわけです。
実際に記載したコード
■Controller
$cases = Categorycarttag::where('category_id',$item->id)->get();
foreach($cases as $case)
{
$carttags = Carttag::where('cart_id',$case->cart_id)
->where('tagcode',$case->tagcode)
->get();
foreach($carttags as $carttag)
{
$categorytags[]=array(
'id'=>$case->id,
'tagcode'=>$carttag->tagcode,
'taggroup'=>$carttag->carttaggroupcode,
'classification'=>$carttag->classification,
'tagname'=>$carttag->name
);
}
}
....
return view('hogehoge.edit',compact('categorytags'));
■View
<table class='btn100' id='list'>
<colgroup>
<col style='width:25%;'>
<col style='width:25%;'>
<col style='width:25%;'>
<col style='width:25%;'>
</colgroup>
<tr>
<th>カート名</th>
<th>TagCode</th>
<th>タググループ</th>
<th>タグ名</th>
</tr>
@foreach($categorytags as $tag)
<tr>
<td>{{$tag['name']}}</td>
<td>{{$tag['tagcode']}}</td>
<td>{{$tag['classification']}}</td>
<td'>{{$tag['tagname']}}</td>
</tr>
@endforeach
</table>
実際に書いていて嵌ったのがview。何度もエラーと怒られました。
原因は取り出した値の呼出し方にありました。
{{$tag->name}} では取得できない
arrayで作成した値は【配列】であって[$hogehoge->hogahoga]で取り出せるのは【オブジェクト】。
言われれば「あぁ~~!」となるのですが、ここら辺の知識がかなり曖昧でした。
情報補完はこちらから
スクリプトの解説
■Controller
カテゴリに関連付けしたタグコードを表示したいので、カテゴリとタグコードを記載したテーブル[categorycaarttags]に対しWhereカテゴリIDで抽出します。
その結果カテゴリIDに関連付けられたカートID&カートタグIDを取り出すことができます。
※この抽出結果が$casesです。
$casesには例えば、楽天市場のタグコード10440003という登録がされています。
これをタグの詳細情報を記載しているテーブル carttagsにはめ込んであげれば欲しい情報をGET出来るので、foreachでループを回し取得した値を配列に押し込みます。
そして、その値をViewへ回します。
■View
前述の通り、Viewでは配列として値を受けとります。
その為、値を表示するためには{{$tag->name}}ではなく{{$tag['name']}}と記載します。
まとめ
後は其々の変更を行うEDITへクリックアクションなどで飛ばしてあげればOK。
多少回り道になっても複合主キーを使わず表現する事はやはりできるみたいですね。


