私は自分のサイトに共有のような機能を作成しようとしています。私はこれらのテーブルを持っています
ユーザー
- ユーザーID
- フルネーム
- ユーザー名など
投稿
- post_id
- ユーザーID
- 役職
- orig_post_id
- 日にち
USER_FOLLOWERS
- follow_id
- ユーザーID
- follower_id
- 日にち
現在のユーザーがフォローしているユーザーから投稿を選択するためのこのクエリがあります。
//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 つだけ取得し、オブジェクトの外に配置します。どんな助けでも大歓迎です。長々とすみません。ハリー・ポッターの投稿からわかるように、私は文字通り泣き崩れています笑 ありがとうございました。