2016-11-04 8 views
0

私は2つのテーブルを持っています.1つはユーザのデータを保持するテーブル、もう1つは代理店のデータを保持するテーブルです。 特定のユーザーの詳細と代理店の詳細を比較する方法を理解しようとしています。例えば、話し言葉と目的の言語を一致させる。テーブルを比較して一致を生成する最も簡単な方法は何ですか? Laravel 5.3

これを行うにはいくつかの方法があるように思われますが、今私はそれを行う方法を理解しようとしています。古いシステムの再構築の癖に

おかげで、古いデータは次のように保存されているので: フランス語、ロシア語、北京語、タイ語、インドネシア語、アラビア語、インド、私はからのデータをつかむ意味アジア

その後、私はこの代理店言語プロファイルを取り、すべてのユーザーと比較して、言語の一致を持つユーザーを印刷する必要があるとして、私は、しかし、そのあと少し混乱し、それを最初

$agency = AgencyLogin::find(196); 
$language = $agency->Languages; 
$lang = explode(',', $language); 

を爆発するテーブルと持っていますそれらの一致が何であるか。

今私は別のインフォセットでは動作しません、何か非常に、粗しようとしている:明らか

$ministry = AgencyLogin::find(184); 
     $prefs = $ministry->Ministry_Preferences; 
     $tags = explode(',', $prefs); 
     $sub_categories = DB::table('descriptor') 
      ->whereIn('tag', $tags) 
      ->get(['subcategory', 'description']); 

     $match = DB::table('users')->select('Ministry_Preferences'); 

     $matches = []; 
     foreach ($match as $mat) { 
      $user = explode(',', $mat); 
      $inter = $tags->intersect($user); 
      $matches = array_add($matches, $inter); 
     } 
     $view->with(['sub_categories', $sub_categories], ['matches', $matches]); 

、あなたのいくつかは、これを見ますと、そのようなデータを保存しないでください」、行くを私はあなたに同意しますが、この方法で多くのデータが格納されています。つまり、データベースの大部分を再構築し、すべてを正しくリンクし、現在のライブを適切に移行するための移行コードを作成する必要がある私たちが最終的にライブに行くとき、現在のローカルdevデータベースのフォーマットに変換します。それは時間がかかるでしょう。私はそれぞれのステップを踏む方法を学ぶ必要があり、その過程で物事を壊す可能性が高いので...ダクトテープを今のところ保ちましょう。

+0

は、あなたがしようとしているコードを表示します既に。 –

+0

私は現在私が試みているものを追加しました。しかし、私は適切に交差を使用していないので、現時点では機能しません。 - 以前は使わなかった – Mugluck

答えて

1

まずアプローチ

あなたがユーザーのための言語に関係機関と同じ方法を保存する場合、私のアドバイスは、最初にこのような言語(ユーザーテーブル内の)文字列の末尾に,を追加することです。 ,French,Russian,Mandarin,Thai,Indonesian,Arabic,Indian,Asian,ですので、簡単なSELECTクエリを作成してこの列を検索することができます。あなたは、あなたの質問に書いたように、その後

UPDATE table SET languages=CONCAT(',',languages,',') WHERE 1 

を代理店の言語を取得し、それらを分割し、それらを反復:

例のクエリはすべてのレコードを更新します。そして、このループクエリのユーザーテーブルに、このように現在の言語に一致するユーザーを検索するには:

SELECT ... FROM users WHERE language LIKE ('%,:language,%) 

または

$agencyLanguage = ','.$agencyLanguage.','; 
SELECT ... FROM users WHERE language LIKE ('%$agencyLanguage%) 

:言語はのバインドさ言語(ループの多くの一つ)であります代理店。

別のアプローチ

現在のDBエンジンは、全文検索をサポートしているなら、あなたは(私はそれがusersテーブル内languages列になります理解として)に対して検索する列に全文索引を置くことができます。そして、あなたは代理店の言語を取得します、この時ませ,で爆発が、そのように置き換える:

$agencyLanguages = '+"French" +"Russian" +"Mandarin"'; 

と、あなたは、検索クエリでこれを使用することができます。

SELECT * FROM users WHERE MATCH (quote) AGAINST (:agencyLanguages IN BOOLEAN MODE) 
+0

これは私の現在のデータベースの知識よりもずっと前です。しかし、これはlaravelでいくつかのDBrawクエリを必要とすると思いますか? – Mugluck

+0

はい、もしあなたが第2のアプローチについて話しているなら。しかし、より最適な方法です(列に '、'で区切られた言語が多すぎる場合) – krasipenkov

+0

まあ、私はどのようにlaravelで最初のものを実装するのか手がかりを得ませんでしたが、 phpで全文検索をしてから、私が想定しているlaravelでそれを行う方法を学びます。ドキュメントによれば、それは正式にはサポートされていません。 – Mugluck

関連する問題