2017-07-05 7 views
0

ユーザーのすべてのプロファイルデータを取得しようとしています。また、ユーザーはバッジを与えることができるサーバー用にアップロードされた複数のファイルを持つことができます。テスト環境に2人のユーザーがおり、1人のユーザーに3つのファイルがあります。コントローラからJSONを返すと3つの結果が得られますが、1つのユーザーがすべてのデータを1つのオブジェクトに格納できるように、結合または結合したいと考えています。ここでLaravelの雄弁な質問にアイテムを集めるには?

JSONを使用すると、ジョン・ドウは、2つのファイルを持っていますが、一つだけ、ジョンが存在することになるので、私は1つのオブジェクトの下にあるすべてのファイルとファイルの種類を持っていると思います見ることができるように、私は現在、

[ 
    { 
     "id":1, 
     "avatar":"john.jpg", 
     "role":2, 
     "first_name":"John", 
     "last_name":"Doe", 
     "user_name":"johndoe", 
     "account_status":2, 
     "one_child":"6", 
     "introduction":"test", 
     "file_type":1, 
     "file":"1498725633.docx", 
     "status":2, 
     "lat":59.44, 
     "lng":24.74, 
     "rating":"5", 
     "recommended":"1", 
     "rating_count":2, 
     "distance":0.29988841983648 
    }, 
    { 
     "id":1, 
     "avatar":"john.jpg", 
     "role":2, 
     "first_name":"Joe", 
     "last_name":"Doe", 
     "user_name":"johndoe", 
     "account_status":2, 
     "one_child":"6", 
     "introduction":"test", 
     "file_type":4, 
     "file":"118771941-merged.mp4", 
     "status":1, 
     "lat":59.44, 
     "lng":24.74, 
     "rating":"5", 
     "recommended":"1", 
     "rating_count":2, 
     "distance":0.29988841983648 
    }, 
    { 
     "id":4, 
     "avatar":"capture.JPG", 
     "role":2, 
     "first_name":"Jane", 
     "last_name":"Doe", 
     "user_name":"janedoe", 
     "account_status":2, 
     "one_child":"4", 
     "introduction":"Test", 
     "file_type":2, 
     "file":"1498732136.docx", 
     "status":1, 
     "lat":59.46, 
     "lng":24.83, 
     "rating":"3", 
     "recommended":"2", 
     "rating_count":2, 
     "distance":5.5651349391591 
    } 
] 

を返しますです1つのJaneオブジェクトはatmです。ここで

は、私は私の移行そうuser_id参照users tableidで行われたすべての接続を持ってlaravel

select 
    `users`.`id` as `id`, 
    `users`.`avatar`, 
    `users`.`role`, 
    `users`.`first_name`, 
    `users`.`last_name`, 
    `users`.`user_name`, 
    `users`.`account_status`, 
    `user_wage_preferences`.`one_child`, 
    `user_introductions`.`introduction`, 
    `user_files`.`file_type`, 
    `user_files`.`file`, 
    `user_files`.`status` as `status`, 
    `user_contact_informations`.`lat`, 
    `user_contact_informations`.`lng`, 
    ROUND(AVG(user_reviews.rating)) AS rating, 
    SUM(user_reviews.recommended) as recommended, 
    COUNT(user_reviews.id) as rating_count, 
    `user_files`.`status`, 
    (
     6371 * acos(cos(radians(59.4424504)) * cos(radians(lat)) * cos(radians(lng) - radians(24.7377842)) + sin(radians(59.4424504)) * sin(radians(lat))) 
    ) 
    AS distance 
from 
    `users` 
    inner join 
     `user_files` 
     on `users`.`id` = `user_files`.`user_id` 
    left join 
     `user_reviews` 
     on `users`.`id` = `user_reviews`.`nanny_id` 
    inner join 
     `user_introductions` 
     on `users`.`id` = `user_introductions`.`user_id` 
    inner join 
     `user_wage_preferences` 
     on `users`.`id` = `user_wage_preferences`.`user_id` 
    inner join 
     `user_contact_informations` 
     on `users`.`id` = `user_contact_informations`.`user_id` 
where 
    `users`.`role` = ? 
    and `users`.`account_status` = ? 
group by 
    `users`.`id`, 
    `users`.`avatar`, 
    `users`.`role`, 
    `users`.`first_name`, 
    `users`.`last_name`, 
    `users`.`user_name`, 
    `user_files`.`status`, 
    `users`.`id`, 
    `user_contact_informations`.`lat`, 
    `user_contact_informations`.`lng`, 
    `user_wage_preferences`.`one_child`, 
    `user_introductions`.`introduction`, 
    `user_files`.`file_type`, 
    `user_files`.`file` 
having 
    `recommended` > ? 
order by 
    `distance` asc jquery - 3.2.1.min.js:2 Uncaught TypeError: Cannot use 'in' operator to search for 'length' in 
    select 
     `users`.`id` as `id`, 
     `users`.`avatar`, 
     `users`.`role`, 
     `users`.`first_name`, 
     `users`.`last_name`, 
     `users`.`user_name`, 
     `users`.`account_status`, 
     `user_wage_preferences`.`one_child`, 
     `user_introductions`.`introduction`, 
     `user_files`.`file_type`, 
     `user_files`.`file`, 
     `user_files`.`status` as `status`, 
     `user_contact_informations`.`lat`, 
     `user_contact_informations`.`lng`, 
     ROUND(AVG(user_reviews.rating)) AS rating, 
     SUM(user_reviews.recommended) as recommended, 
     COUNT(user_reviews.id) as rating_count, 
     `user_files`.`status`, 
     (
     6371 * acos(cos(radians(59.4424504)) * cos(radians(lat)) * cos(radians(lng) - radians(24.7377842)) + sin(radians(59.4424504)) * sin(radians(lat))) 
    ) 
     AS distance 
    from 
     `users` 
     inner join 
     `user_files` 
     on `users`.`id` = `user_files`.`user_id` 
     left join 
     `user_reviews` 
     on `users`.`id` = `user_reviews`.`nanny_id` 
     inner join 
     `user_introductions` 
     on `users`.`id` = `user_introductions`.`user_id` 
     inner join 
     `user_wage_preferences` 
     on `users`.`id` = `user_wage_preferences`.`user_id` 
     inner join 
     `user_contact_informations` 
     on `users`.`id` = `user_contact_informations`.`user_id` 
    where 
     `users`.`role` = ? 
     and `users`.`account_status` = ? 
    group by 
     `users`.`id`, 
     `users`.`avatar`, 
     `users`.`role`, 
     `users`.`first_name`, 
     `users`.`last_name`, 
     `users`.`user_name`, 
     `user_files`.`status`, 
     `users`.`id`, 
     `user_contact_informations`.`lat`, 
     `user_contact_informations`.`lng`, 
     `user_wage_preferences`.`one_child`, 
     `user_introductions`.`introduction`, 
     `user_files`.`file_type`, 
     `user_files`.`file` 
    having 
     `recommended` > ? 
    order by 
     `distance` asc 

から抽出された私の生のSQLです。どのように私は1つのユーザーオブジェクトの下にすべてのファイルを取得できますか?

+0

ユーザーを取得するために使用するlaravelコードを表示してください –

答えて

3

usersテーブルとuser_filesテーブルをクエリに追加する代わりに、relationを追加できます。

public function files() 
{ 
    return $this->hasMany('App\UserFiles', 'user_id'); 
    //Where UserFiles is the name of the model of the user_files table 
    //and user_id is the foreign key 
} 

あなたは、この関係を設定したら、あなたがwithを使用して、クエリにfiles関係を追加することができます:

usersモデルに、あなたのケースで

は、このような関数の何かを持っているでしょう

Users::with('files')->where(...)->orderBy(...)->get(); 

これがそうのようなユーザーオブジェクトにファイルをロードします:

{ 
    "id":1, 
    "avatar":"john.jpg", 
    "role":2, 
    "first_name":"John", 
    "last_name":"Doe", 
    "user_name":"johndoe", 
    "account_status":2, 
    "one_child":"6", 
    "introduction":"test", 
    "files": [ 
     { 
      //File Object 
     }, 
     { 
      //File Object 
     } 
    ], 
    "lat":59.44, 
    "lng":24.74, 
    "rating":"5", 
    "recommended":"1", 
    "rating_count":2, 
    "distance":0.29988841983648 
} 
+1

ありがとうございました!私は質問をやり直さなければならないが、あなたは何を意味するのか分かる。ありがとう:) – raqulka