# 我來決定給你看什麼資料,在controller中篩選資料
#### 使用laravel 版本8.x
:::success
前期提要(?),我有一個發表文章的功能,發表的時候可以選擇文章的類型。
:::

:::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`