iwantit
@iwantit

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

laravel,postgresでメールテーブルと既読テーブルを連結して 既読と未読のグループに分ける処理を分けたいdesu.

解決したいこと

laravel postgresでメールテーブルと既読テーブルを連結して
既読と未読のグループに分ける処理を分けたいdesu.

現在下記の処理ではご覧の通り
既読のメールのみセレクトしております。

            $MailTypes = Mail::
            selectRaw('m_mail.*')
            ->selectRaw('m_kidoku.*')

                ->join('m_kidoku', function ($join) {
                    // 既読テーブルと結合
                    $join->on('m_kidoku.m_news_id', '=', 'm_mail.id');
                })
                ->get();

Book1 - Excel 2022-04-07 05.29.56.png

これをメールテーブルと既読テーブルを連結して
既読と未読のグループに分ける処理を分けたいです。

何か方法はあるでしょうか?
どなたかお願いします。

0

1Answer

「既読テーブルにデータが存在していれば既読」ということでしたら、
LEFT JOINで結合すれば未読の場合はNULLで取得されるはずなので、
既読テーブルの有無を見ればよいです。

SELECT
  m.*,
  k.*, -- 未読のデータはこれがNULLになるので処理で判定できる
  -- もしくはSQLで0/1として取得してしまう
  (CASE WHEN k.id IS NULL THEN 0 ELSE 1 END) AS is_read
FROM
  m_mail m
LEFT JOIN m_kidoku k ON m.id = k.m_news_id
0Like

Comments

  1. @iwantit

    Questioner

    丁寧な解説ありがとうございます!
    これを下記のeloquent?の書き方にすると
    どのようになるか教えて頂くことは可能でしょうか?



    ```
    $MailTypes = MNews::
    selectRaw('m_mail.*')
    ->selectRaw('m_kidoku.*')

    ->join('m_kidoku', function ($join) {
    // 既読テーブルと結合
    $join->on('m_kidoku.m_news_id', '=', 'm_mail.id');
    })
    ->get();
    ```
  2. 同様にselectRawを使えばいいと思いますよ。

    ->selectRaw('(CASE WHEN m_kidoku.id IS NULL THEN 0 ELSE 1 END) AS is_read')
  3. @iwantit

    Questioner

    ありがとうございます。

    既読テーブルの連携で該当データは取得出来ましたが、
    既読テーブルに無い(未読)のデータ(m_mail/id,read_flg)が取れません (汗)


  4. ->join()はINNER JOINなので->leftJoin()を使ってください。
  5. @iwantit

    Questioner

    返信遅れましてすいません。

    ありがとうございます。
    leftjoinとjoinにnullを許容するかどうかの違いがあったことはそれほど意識していませんでした。
    勉強になりました。

Your answer might help someone💌