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

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

ただいまの
回答率

88.05%

MySQLからとってきたデータに余計な階層が入ってしまう

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,373

score 183

プログラム初心者です。

今CakePHPの練習でSNSアプリを開発しているのですが、
友人一覧のデータを引き出す際、余計な階層が入ってしまいます。。。

テーブルは2つ使用していて、下記のような構成です。

■usersテーブル(アカウント情報が入っている)
→id(ユーザーid),username,password,profile(自己紹介文),filename(プロフィール写真のファイル名),contents(プロフィール写真),filetype(プロフィール写真のファイルタイプ),filesize(プロフィール写真のファイルサイズ)

■friendsテーブル(どのユーザーとどのユーザーが友達かという関係性の情報が入っている)
→id(ただの識別番号),myid(ユーザーid),friend_id(友人のユーザーid)

FriendsController内は下記のように記述しております。

public $uses = array('Friend', 'User');

public function index() { //友人一覧表示
            
            //Friendテーブルから、”自分のid-友だちのUser_id”のデータをリストアップ
            $myfriend_lists = $this->Friend->find('all', array('conditions' => array('Friend.myid' => $this->Auth->user('id'))));
            $myfriend_lists_count = $this->Friend->find('count', array('conditions' => array('Friend.myid' => $this->Auth->user('id'))));
            
            //”自分のid-友だちのUser_id”から友だちのUser_idリストを抽出し、友だちidリストを作成
            for($i=0; $i < $myfriend_lists_count; $i++){
                $myfriend_id_lists[$i] = $myfriend_lists[$i]['Friend']['friend_id'];
            };
            $myfriend_id_lists_count = count($myfriend_id_lists);
            
            //友達idリストから友達のアカウント情報を取ってくる
            for($i=0; $i < $myfriend_id_lists_count; $i++) {
                $myfriend_account_lists[$i] = $this->User->find('all', array('conditions' => array('User.id' => $myfriend_id_lists[$i])));
            }
            var_dump($myfriend_account_lists[0]); //★★
            
            //友達のUserデータから、名前のみをリスト化
            for($i=0; $i < $myfriend_lists_count; $i++){
                $myfriend_name_lists[] = $myfriend_account_lists[$i][0]['User']['username'];
            };
            debug($myfriend_account_lists[0]);
            $this->set('myfriends', $myfriend_account_lists);
        }

★★で示したところでvar_dumpで変数の中身を確認したのですが、
下記のようになっており、
友人のアカウント情報はとれているのですが、
▲▲で印をつけた階層が不要な気がします。。。

array(4) { 
    [0]=> array(1) { 
        [0]=> array(1) { //▲▲
            ["User"]=> array(11) { 
                ["id"]=> string(2) "18" 
                ["username"]=> string(4) "SAKU" 
                ["password"]=> string(40) "be013196effeda954f142bc550ccb91c6d9b9e3a" 
                ["profile"]=> NULL 
                ["filename"]=> string(0) "" 
                ["contents"]=> string(0) "" 
                ["filetype"]=> string(10) "" 
                ["filesize"]=> string(1) "0" } } } 
    [1]=> array(1) { 
        [0]=> array(1) { //▲▲
            ["User"]=> array(11) { 
                ["id"]=> string(2) "21" 
                ["username"]=> string(3) "WAO" 
                ["password"]=> string(40) "b3f22c58a1e13408bb97be7097cfb13d0b32939f" 
                ["profile"]=> string(10) "I am WAO!!" 
                ["filename"]=> string(0) "" 
                ["contents"]=> string(0) "" 
                ["filetype"]=> string(10) "" 
                ["filesize"]=> string(1) "0" } } } 
…略…
}

想定していたのは、下記のようなデータなのですが、
この余計な階層をなんとかできないでしょうか??

array(4) { 
    [0]=> array(1) { 
        ["User"]=> array(11) { 
                ["id"]=> string(2) "18" 
                ["username"]=> string(4) "SAKU" 
                ["password"]=> string(40) "be013196effeda954f142bc550ccb91c6d9b9e3a" 
                ["profile"]=> NULL 
                ["filename"]=> string(0) "" 
                ["contents"]=> string(0) "" 
                ["filetype"]=> string(10) "" 
                ["filesize"]=> string(1) "0" } } 
    [1]=> array(1) { 
            ["User"]=> array(11) { 
                ["id"]=> string(2) "21" 
                ["username"]=> string(3) "WAO" 
                ["password"]=> string(40) "b3f22c58a1e13408bb97be7097cfb13d0b32939f" 
                ["profile"]=> string(10) "I am WAO!!" 
                ["filename"]=> string(0) "" 
                ["contents"]=> string(0) "" 
                ["filetype"]=> string(10) "" 
                ["filesize"]=> string(1) "0" } } 
…略…
}

ぜひご教示頂けますと幸いでございます。

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+2


友達のアカウント情報を取得する箇所でfind 'all' としているのが原因だと思います。
find 'first'なら結果は必ず1件なのでそのまま返って来ますが、
'all'でデータを取得できた場合、戻り値は必ず配列で返ってきます。

//友達idリストから友達のアカウント情報を取ってくる
for($i=0; $i < $myfriend_id_lists_count; $i++) {
    $myfriend_account_lists[$i] = $this->User->find('all', array('conditions' => array('User.id' => $myfriend_id_lists[$i])));
}


ちなみに、cakeは検索条件に配列をそのまま使えるので
以下のようにすればまとめて友達情報を取得できるはずです。

$myfriend_account_lists = $this->User->find('all', array('conditions' => array('User.id' => $myfriend_id_lists)));

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.05%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る