2

私は自分のサイトに共有のような機能を作成しようとしています。私はこれらのテーブルを持っています

ユーザー

  1. ユーザーID
  2. フルネーム
  3. ユーザー名など

投稿

  1. post_id
  2. ユーザーID
  3. 役職
  4. orig_post_id
  5. 日にち

USER_FOLLOWERS

  1. follow_id
  2. ユーザーID
  3. follower_id
  4. 日にち

現在のユーザーがフォローしているユーザーから投稿を選択するためのこのクエリがあります。

//user_id from session data
$user_id = $this->session->userdata('user_id');

$sql = "SELECT  p.*,u.fullname,u.username
        FROM    (
                 SELECT  user_id
                 FROM    user_followers
                 WHERE   follower_id = $user_id
                 UNION ALL
                 SELECT  $user_id
                ) uf
        JOIN    posts p
        ON      p.user_id = uf.user_id
        JOIN users u
        ON     u.user_id = p.user_id
        ORDER BY p.post_date DESC";


$query = $this->db->query($sql);

 if ($query) {

            foreach ($query->result() as $row) {
                $branch_id = $row->orig_post_id;
                $post_array[] = array(
                    'post_id' => $row->post_id,
                    'user_id' => $row->user_id,
                    'post' => $row->post,
                    'is_branch_of_id' => $branch_id,
                    'post_date' => $row->post_date,
                    'fullname' => $row->fullname,
                    'username' => $row->username
                );



             #i would explain what i'm tying to do here below


      if ($branch_id != 0) {
            $branch_array = array();
            #this contains the orignal posts user id
            $user_branch_id = $this->postid_return_user_id($branch_id);
            $branch_data = $this->branch_query($user_branch_id, $branch_id);
            $branch_array[] = array(
                'branch_uname' => $branch_data->username,
                'branch_fname' => $branch_data->fullname,
                'orig_post' => $branch_data->post
            );

            $post_obj = (object)array_merge($branch_array, $post_array);
        } else {
            $post_obj = (object)$post_array;
        }


            }
            return $post_obj;

次に、ブランチクエリ

   public function branch_query($orig_post_user_id, $orig_post_id)
    {
        $sql = "SELECT  users.username,users.fullname,posts.post,posts.post_id
                FROM   users u
                JOIN    posts p
                ON      p.user_id = u.user_id
                WHERE   u.user_id = $orig_post_user_id
                AND     p.post_id = $orig_post_id";
        $q = $this->db->query($sql);
        return ($q)?$q->result():array();
    }

まず、post_array で必要なデータを取得します。

フィールド orig_post_id が 0 でない場合、その投稿は別の投稿のユーザーによって共有されました。branch_array という別の配列を作成します。ブランチ配列は、元の投稿のユーザー名、フルネーム、および元の投稿自体を含むことを意図しています。ここでブランチ クエリの出番です。ブランチ クエリでは、元のユーザーのユーザー ID と元の投稿 ID を渡し、元の投稿ユーザーのユーザー名、フルネーム、および投稿自体を返します。次に、ブランチ データ変数のようにこれを取得し、ブランチ配列に入れます。

ここで、分岐データを post_array にマージし、マージされた配列をオブジェクトに変換しようとしています。私の望ましい出力は次のようになります。

シナリオ 1、orig_post_id が 0 でない場合

$post_obj = new stdClass([post_id] => 4,
                        [user_id] => 2,
                        [post] => ok ginny,
                        [orid_post_id] => 3,
                        [post_date] => some timestamp,
                        [fullname] => Harry Potter,
                        [username] => avadakedevra,
                        [branch_uname] => ginny,
                        [branch_fname] => Ginny Potter
                        [orig_post] => stop it harry
) 

ご覧のとおり、分岐したデータがマージされました。シナリオ 2、orig_post_id = 0 の場合

$post_obj = new stdClass([post_id] => 3,
                        [user_id] => 1,
                        [post] => stop it harry,
                        [orid_post_id] => 0,
                        [post_date] => some timestamp,
                        [fullname] => Ginny Potter,
                        [username] => ginny
) 

現時点では、ブランチ データを 1 つだけ取得し、オブジェクトの外に配置します。どんな助けでも大歓迎です。長々とすみません。ハリー・ポッターの投稿からわかるように、私は文字通り泣き崩れています笑 ありがとうございました。

4

1 に答える 1

2

それは、物事を必要以上に複雑にしているだけです。これを試して

 foreach ($query->result() as $row) {
                $branch_id = $row->is_branch_of_id;
                $user_branch_id = $this->postid_return_user_id($branch_id);
                $post_array[] = array(
                    'post_id' => $row->post_id,
                    'user_id' => $row->user_id,
                    'post' => $row->post,
                    'is_branch_of_id' => $branch_id,
                    'post_date' => $row->post_date,
                    'fullname' => $row->fullname,
                    'username' => $row->username,
                    'file_path_thumb' => $row->file_path_thumb,

                    'data' => $this->branch_query($user_branch_id, $branch_id)

                );
                    $post_obj = $this->array_to_object($post_array);

            }

post_array は多次元であるため、オブジェクトに変換するにはこの関数が必要です。

 public function array_to_object($array) {
        $obj = new stdClass;
        foreach($array as $k => $v) {
            if(is_array($v)) {
                $obj->{$k} = $this->array_to_object($v);
            } else {
                $obj->{$k} = $v;
            }
        }
        return $obj;
    }
于 2013-01-09T01:08:14.887 に答える