WST87448735
@WST87448735

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

[Laravel]ユーザーに国籍を持たせるDB設計 

現在Laravel6においてアプリを開発しています。

解決したいこと

新規登録の際にユーザーに国籍を持たせて、セレクトボックスのプルダウンにリンクをつけて国名を選択するとそ国籍のユーザーの投稿が表示されるようにしたいです。

リンクをつける際に{{ route('countries.index',$country) }}とかしてCountryテーブルを作る方法で大丈夫でしょうか???

該当するソースコード

新規登録の際も下記のようなコードでUserテーブルのcountryカラムに国名が入るようになっています。

index.php
<select type="text" class="form-control" name="country" onChange="location.href='{{ route('recipes.index') }}'">
                    @foreach(config('country') as $key => $score )
                        <option value="{{ $score }}">{{ $score }}</option>
                    @endforeach
</select>
config/country.php
<?php 
return array(
  '0' => '未選択',
  '1' => 'アイスランド', 
  '2' => 'アイルランド', 
  '3' => 'アフガニスタン', 
  '4' => 'アメリカ合衆国',
  '5' => 'アラブ首長国連邦', 
  '6' => 'アルゼンチン', 
  '7' => 'イギリス', 
  '8' => 'イスラエル',
  '9' => 'イタリア', 
  '10' => 'イラク', 
  '11' => 'イラン', 
  '12' => 'インド',
  '13' => 'インドネシア', 
  '14' => 'ウクライナ', 
  '15' => 'ウズベキスタン', 
  '16' => 'ウルグアイ',
、、、省略

自分で試したこと

上記のコードだとどういう設計にすれば良いのかそもそも構造が悪いのでしょうか??

よろしくお願いいたします。

0

3Answer

仕様がよくわかりませんが、基本的にdb設計は1対1、1対多、多対多の3種類があって、大体1対1の場合、マスタテーブルがあるならそのマスタのid、ないなら国名(テキスト)、もしくは今回みたいにapplication側でconstかなんかで定義した配列のkeyを紐づけたいテーブル(今回はusersテーブル?)に保存、1対多の場合は、1がuserで、countryが多の場合はcountryテーブルに親のuserのidを保存して、多対多の場合は中間テーブルという紐づけたいお互いのidを保存するテーブルを作成するのが基本だと思います。
もちろん、これら以外の方法でも、ご自身のアプリケーションの仕様を満たすのであれば、オッケーだと思います。

リンクをつける際に{{ route('countries.index',$country) }}とかしてCountryテーブルを作る方法で大丈夫でしょうか???

よくわかりませんが、やりたいことができるなら多分大丈夫だと思いますよ。

db設計というタイトルだったので、db設計についてコメントしましたが、聞きたい内容とずれてたらすいません。
あと、気になったところですが、selectにtype属性て設定できるんですか?
逆質問になってすいませんが、調べてもヒットしなかったので、何か参考にされた記事があったら教えてほしいです。

1Like

Comments

  1. @WST87448735

    Questioner

    やりたいこととしては、ユーザーに国籍を持たせて、サイドバーにプルダウンで国一覧を、表示して色々な国の料理に飛べるようにしたいです!
  2. であれば、あくまで自分が実装するなら、usersテーブルにcountryフィールドを追加して、会員登録時にcountryを登録させる
    会員が親となる料理テーブル(itemsテーブルと仮定)に親の会員idを保存するuser_idフィールドを追加して、Itemを作成(投稿)した時、そのuserのidをItemのuser_idフィールドに保存する
    で、config.country.phpの配列をforeachで回してサイドに表示
    @foreach (config('country') as $key => $value)
    <a href="{{route('hoge', ['country_key' => $key])}}">{{$value}}</a>
    .....
    @endforeach
    飛んだ先で、
    $key = $request->route('country_key');
    $result = Items::join('users', 'users.id', '=', 'items.user_id')->where('users.country', '=', $key)->groupBy('items.id')->get();

    でいけそうな気がします。
    実際に実行して確かめたわけではないので、何かしらエラーや期待した内容が返ってくるかわかりませんが、あくまで自分はこんな感じでやりますってことで参考にしてください。
  3. @WST87448735

    Questioner

    丁寧にありがとうございます!
    試してみます!
  4. @WST87448735

    Questioner

    この場合、routeの書き方はどうなるんでしょうか??💦
  5. あくまで一例ですが、
    Route::get('hoge/{country_key}', 'HogeController@showItems')->name('hoge.show.items');
    みたいな感じで行けると思います
  6. @WST87448735

    Questioner

    この場合country_keyはどこから来てるんでしょうか?💦 
    何度もすみません🙇‍♂️
  7. config/country.php
    の配列をforeachで回した想定で
    そのkey('0','1'など)を想定していました
    <a href="{{route('hoge', ['country_key' => $key])}}">{{$value}}</a>
    こんな感じですが、質問に合ってます?
  8. @WST87448735

    Questioner

    <a href="{{route('hoge', ['country_key' => $value])}}">{{$value}}</a>

    こんなイメージでしょうか?
    自分の今の理解ですと書いてくださったコードの$keyと$valueは同じイメージでして💦
  9. @WST87448735

    Questioner

    アドバイスのおかげである程度形になってきました!
    1点、$key = $request->route('country_key');

    Undefined variable: request
    とエラーになります💦
    post用のルーティングも作成しないとRequestは使えないでしょうか?
  10. いや、普通に
    public function hoge(Request $request) {
    $key = $request->route('country_key');
    で取れませんか?
    参考コードというかブログ↓
    https://begien.com/article/13/view#:~:text=%E9%A0%91%E5%BC%B5%E3%82%8A%E3%81%BE%E3%81%97%E3%82%87%E3%81%86%EF%BC%81-,%E4%BF%9D%E5%AD%98%E3%81%97%E3%81%9F%E3%83%87%E3%83%BC%E3%82%BF%E3%82%92%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B,-%E3%81%95%E3%81%A6%E3%80%81%E3%81%9D%E3%82%8C%E3%81%A7%E3%81%AF%E3%80%81%E3%83%96%E3%83%AD%E3%82%B0
    こちらの「保存したデータを表示する」を見ていただいて、ご自身のコードと照らし合わせて見ればわかるかもしれません。
    ちなみに私の個人ブログですので、つまづいたりした際に覗いてみていただけると幸いです!
  11. @WST87448735

    Questioner

    ありがとうございます🙇‍♂️
    今後参考にさせていただきます!
    あとはクエリビルダでレシピを取得するところさえできれば完成に近づきそうです😁

Your answer might help someone💌