# 我來決定給你看什麼資料,在controller中篩選資料 #### 使用laravel 版本8.x :::success 前期提要(?),我有一個發表文章的功能,發表的時候可以選擇文章的類型。 ::: ![](https://i.imgur.com/T3tfStQ.png) :::info 我還有一個主頁,上面會顯示很多筆資料,這些資料來自不同的資料表,而且每種資料只顯示一部分,大多只要最新的資料、或者必須是上架中的資料。 ::: ```php= // 一起回家 首頁(前台) 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')); } ``` :::warning where主要是透過`key:value`來進行篩選,在寵物送養那邊,`where('launched','上架中')`,表示說,我要先篩選這個資料表裡面,launched欄位的值是上架中,的所有資料。所以不是上架中的都不會被抓出來。 ::: :::warning `orderbydesc('id')`則是針對id這個欄位進行降冪排序,也就是由大到小依序排下來。 `desc`是降冪、`asc`是升冪。 不過好像沒有`orderbyasc('id')`,我猜是因為正常來講,預設的排序就已經是升冪了,就是說本來排序就是由小到大,所以就沒有這個了。 另一種做法是`orderBy('id','desc')`或者`orderBy('id','asc')`。 ::: :::warning `take(8)`就是依順序只取八筆。 ::: :::warning `latest()`則是以時間來做依據,由時間最近的方式來排序。 ::: :::warning 如果你想要同時篩選出兩種情況,不可以用`where(動物新聞文章)->where(動保法律文章)`,在我這個資料表中,像這樣用會產生衝突,找不到任何資料,要用`where(動物新聞文章)->orWhere(動保法律文章)`,就可以把動物新聞跟動保法律都找出來。 ::: :::danger 上面這些篩選資料的方式,我們一般稱為Query Builder(大概、應該)。 其中這個where()有非常多種延伸變化,幾乎可以說是一個家族,有機會會補充在這一篇。 ::: ###### tags: `laravel` `laravel.8` `Query Builder` `資料篩選` `where` `take` `orderby` `orderbydesc` `first` `latest`