便利なメソッドが見つからなかったので、単にorWhere条件で抽出する。
// 例:掲載終了日時が到来していない・もしくは掲載終了日時がNULLの記事を取得する場合
$articles = Article::whereDate('display_end_date', '>', now())->orWhereNull('display_end_date')->get();
他にも条件がある場合はA & (B or C)になるようにクロージャを使用する。
// 例:ID > 1000のうち、掲載終了日時が過ぎている・もしくは掲載終了日時がNULLの記事を取得する場合
$articles = Article::where('article_id', '>', 1000)
->where(function ($query) {
$query->whereDate('display_end_date', '>', now())
->orWhereNull('display_end_date');
})->get();
...と書いている途中に、そもそも設計の時点でDBの値がNULLになることが少なくなるようにしたほうがいいのでは?と思った。
NULLが設定されたカラムは「NULLがどういった意味なのか」という設計者の意図が読み取りにくい気がする。
(上記例では「掲載終了日時にNULLが設定されているものはいつまでも残す」の意だが本当にそう読み取れるか怪しい)
掲載終了日時であれば「いつまでも残すものには9999-12-31を設定する」とかにしておけば、「ああ、時間経過で消えない通知なのね」ということがわかるし、NULLを考慮しなくてよくなるのでorWhereNullの条件自体要らなくなる!!...はず。