Try   HackMD

我來決定給你看什麼資料,在controller中篩選資料

使用laravel 版本8.x

前期提要(?),我有一個發表文章的功能,發表的時候可以選擇文章的類型。

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

我還有一個主頁,上面會顯示很多筆資料,這些資料來自不同的資料表,而且每種資料只顯示一部分,大多只要最新的資料、或者必須是上架中的資料。

// 一起回家 首頁(前台) public function index() { // 取八篇最新的寵物送養 $animal = Animal::where('launched', '上架中')->orderbydesc('id')->take(8)->get(); // 只取一篇最新的最新消息 // 下面沒辦法只取一筆,不過first()居然取到動物新聞跟動保法律的資料 怪怪 // $news = News::where('type', '最新消息')->orderbydesc('id')->first()->get(); // $news = News::where('type', '最新消息')->latest()->get(); // 下面這個到底抓了什麼... // $news = News::where('type', '最新消息')->latest()->take(1); // 下面都可以只取一筆,但會報錯... // $news = News::where('type', '最新消息')->orderbydesc('id')->first(); // $news = News::where('type', '最新消息')->latest()->first(); // 下面都可以只取一筆,不會報錯 // $news = News::where('type', '最新消息')->orderbydesc('id')->take(1)->get(); $news = News::where('type', '最新消息')->latest()->take(1)->get(); // dd($news); // 只取兩篇最新的動保新聞 $law = News::where('type', '動物新聞')->orWhere('type','動保法律')->orderBy('id','desc')->take(2)->get(); return view('frontpage.index',compact('animal','news','law')); }

where主要是透過key:value來進行篩選,在寵物送養那邊,where('launched','上架中'),表示說,我要先篩選這個資料表裡面,launched欄位的值是上架中,的所有資料。所以不是上架中的都不會被抓出來。

orderbydesc('id')則是針對id這個欄位進行降冪排序,也就是由大到小依序排下來。
desc是降冪、asc是升冪。
不過好像沒有orderbyasc('id'),我猜是因為正常來講,預設的排序就已經是升冪了,就是說本來排序就是由小到大,所以就沒有這個了。
另一種做法是orderBy('id','desc')或者orderBy('id','asc')

take(8)就是依順序只取八筆。

latest()則是以時間來做依據,由時間最近的方式來排序。

如果你想要同時篩選出兩種情況,不可以用where(動物新聞文章)->where(動保法律文章),在我這個資料表中,像這樣用會產生衝突,找不到任何資料,要用where(動物新聞文章)->orWhere(動保法律文章),就可以把動物新聞跟動保法律都找出來。

上面這些篩選資料的方式,我們一般稱為Query Builder(大概、應該)。
其中這個where()有非常多種延伸變化,幾乎可以說是一個家族,有機會會補充在這一篇。

tags: laravel laravel.8 Query Builder 資料篩選 where take orderby orderbydesc first latest