Решил запилить кальку с документации Laravel, судя по личному опыту и вопросам на форуме, не все знают что именно и где искать. Собрал основные, по моему мнению, методы для работы с моделями и базой данных.
Пишите в комментариях те методы, которые вы бы посоветовали выучить в первую очередь. Про ошибки тоже пишите, исправлю.
Итак, у нас есть модель Post. Как нам ее получить из БД:
Просто получаем все существующие посты:
Post::all();
На выходе получаем коллекцию, даже если пост был всего один, а значит доступ к его свойствам (имени и т.д.) получаем внутри цикла.
Post::get();
На выходе получаем коллекцию. Используем вместо all(), когда нужно поставить условия, о которых ниже.
Post::first();
На выходе получаем первую подходящую по условиям модель, а значит можем обращаться к свойствам напрямую. Используем в основном с условиями, о них ниже.
Post::find(1);
На выходе получаем объект модели Post с id == 1.
Условия.
Post::where();
То, чем придется пользоваться чаще всего. Внутри помещаем поле, по которому хотим искать, и значение:
Post::where('name','=','october');
Будем искать все посты с именем october. На данном этапе мы имеем объект класса QueryBuilder. Для того, чтобы получить коллекцию, мы должны воспользоваться одним и способов, описанных в первой части, например:
Post::where('name','=','october')->get();
Вместо знака '=' мы можем ставить мы можем ставить '!=' - неравно, '<' - меньше, '>' - больше. Сам знак равенства можем опустить:
Post::where('name','october');
имеет то же значение, что и Post::where('name','=','october');
Кроме того, мы можем использовать названия столбцов вместе с where:
Post::whereName('october');` то же, что и` Post::where('name','=','october');
Можем использовать для поиска нулевых значений:
Post::whereNull('parent_id);` то же, что и `Post::where('parent_id, '=', NULL);
И наоборот:
Post::whereNotNull('parent_id);` то же, что и `Post::where('parent_id, '!=', NULL);
Мы можем передать несколько фильтров
для поиска:
Post::where([
['name', '=', 'october'],
['id', '<', 3],
]);
Если первое условие where не нашло ни одной модели, можем использовать дополнительное условие orWhere
Post::where('id',2)->orWhere('id',3)->first();
- если пост с id 2 не будет найден, будет поиск по id 3;
***В примере выше между первым и вторым условием стоит логический оператор ИЛИ. Бывают ситуации, когда у нас есть, допустим три условия, между вторым и третьим мы хотим иметь ИЛИ, но первое должно быть выполнено обязательно.Если мы просто напишем так:
Post::where('id',2)->where('name','october')->orWhere('name','laravel')->get();
- то при отсутствии поста с id 2, но при наличии постов c именем laravel, мы все равно получим свою коллекцию. Чтобы поставить нужное нам $a И ($b или $c), мы можем использовать замыкание:
Post::where('id',2)->where(function($query){
$query->where('name','october')->orWhere('name','laravel');
});
Если нам нужно найти все посты c id, попадающими под значения массива $array = [1,2,3];
Post::whereIn('id',$array);
Отношения.
Получаем только посты с комментариями:
Post::has('comments')->get();
Получаем посты только с комментариями, у которых id больше 10:
Post::whereHas('comments', function($query){
$query->where('id', '>', 10);
});
Если мы получим все посты так: Post::all(); ,а затем уже на фронте в цикле будем обращаться к комментариям, то каждое обращение будет формировать запрос к базе данных. Чтобы загрузить посты сразу с комментариями:
Post::with('comments')->get();
*** В модели может стоять public $with = ['comments']; ,это значит, что каждый ваш запрос будет автоматически подгружать комментарии, как в примере выше.
Если у комментариев есть свои отношения,например автор, можем подгрузить и его, через точку:
Post::with('comments.author')->get();
Можем получить количество комментариев с помощью:
Post::withCount('comments')->get();
Мы можем 'догрузить' наши отношения уже после получения коллекции с помощью load():
$posts = Post::all();
$posts->load('comments');
Прочие методы Collection.
Если мы хотим получить из коллекции массив:
Post::all()->toArray();
Чаще всего используется вместе с pluck(), чтобы получить массив нужных нам данных, например массив всех id постов:
Post::all()->pluck('id')->toArray;
pluck() пришел на замену устаревшему lists(), который вы можете встретить в старом коде.
Если мы хотим удалить объект, например с id 2 из коллекции:
Post::all()->reject(function($query){
return $query->id == 2;
});
Когда мы получили большую коллекцию, и нам нужно провести какую-либо операцию, а памяти не хватает:
Post::all()->orderBy('id')->chunk(1000, function($query){
foreach($query as $queryItem) {
// тут операции
}
});
Для chunk()
необходимо использовать orderBy()
, который упорядочивает коллекцию по указанному столбцу.