воскресенье, 9 июля 2017 г.

LAREVEL. КОНСТРУКТОР ЗАПРОСОВ

Конструктор — специальный класс с набором методов, каждый из которых формирует определенную часть запроса.


Работаем с App\Http\Controllers\Admin\Core.php

vendor\laravel\framework\src\Illuminate\Database\Connection.phpздесь описан метод table.

Класс Builder описан здесь:
\vendor\laravel\framework\src\Illuminate\Database\Query\Builder.php



Документация: https://laravel.com/docs/5.4/queries

Метод get() выбирает всю информацию из интересующей таблицы.

Выберем все записи: "select * from `articles`":
$articles = DB::table('articles')->get();

Выбирает только первую запись: "select * from `articles` limit 1"
$articles = DB::table('articles')->first();

Выборка по одному полю: "select `name` from `articles` limit 1". Возвращает строку.
$articles = DB::table('articles')->value('name');

Выберем записи порциями:
<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB; // подключим БД

class Core extends Controller
{
protected static $articles;

// В конструкторе мы также можем определить список посредников для работы.
public function __construct() {
//$this->middleware('mymiddle');
}

public static function addArticles($array) {
return self::$articles[] = $array;
}


// Возвращает список материалов:
public function getArticles() {

// Выборка по частям, укажем, что на нужны 2 записи

DB::table('articles')->orderBy('id')->chunk(2, function($articles) {
// обработаем порции данных
foreach($articles as $article) {
Core::addArticles($article);
}
});

dump(self::$articles);

}

// Возвращает один материал:
public function getArticle($id) {
echo $id;
}
}

Возвращает:
"select * from `articles` order by `id` asc limit 2 offset 0"

"select * from `articles` order by `id` asc limit 2 offset 2"

"select * from `articles` order by `id` asc limit 2 offset 4"

"select * from `articles` order by `id` asc limit 2 offset 6"

"select * from `articles` order by `id` asc limit 2 offset 8"

Выборка информации по определенному полю:
$articles = DB::table('articles')->pluck('name');

pluck в отличие от value выбирает все записи по определенному полю.
"select `name` from `articles`"

count() возвращает кол-во записей таблицы:
$articles = DB::table('articles')->count(); // "select count(*) as aggregate from `articles`"

max() выбирает максимальное значение определенного поля:
$articles = DB::table('articles')->max('id'); // "select max(`id`) as aggregate from `articles`"

select() удобен, если нужно указать определенные поля
// $articles = DB::table('articles')->select('name', 'id', 'text'); // возвращается объект класса Builder
$articles = DB::table('articles')->select('name', 'id', 'text')->get(); // возвращает сформированный запрос в виде массива

distinct() выборка только уникальных значений
$articles = DB::table('articles')->distinct()->select('name')->get(); // "select distinct `name` from `articles`"

Пример с условием:
$query = DB::table('articles')->select('name'); // здесь сохраняется объект класса Builder
Здесь идет код. Если он выполняется, то выбираем еще по другим полям.
$articles = $query->addSelect('text AS fulltext')->get(); // addSelect добавляет поля в будущий sql-запрос. text AS fulltext - псевдоним

Добавим в запрос условие Where, т.е используем фильтрацию:
у where 3 аргумента: поле, оперетор зравнения и значение
$articles = DB::table('articles')->select('name', 'id', 'text')->where('id', '=', 2)->get();
// выводит, подготовливая значение: "select `name`, `id`, `text` from `articles` where `id` = ?"

Если необходимо указать несколько условий:
$articles = DB::table('articles')->select('name', 'id', 'text')
->where('id', '>', 2)
->where('name', 'like', 'test%')
->get();

// "select `name`, `id`, `text` from `articles` where `id` > ? and `name` like ?"
Добавим логическое или:
$articles = DB::table('articles')->select('name', 'id', 'text')
->where('id', '>', 2)
->where('name', 'like', 'test%', 'or')
->get();
Запрос выглядит так: "select `name`, `id`, `text` from `articles` where `id` > ? or `name` like ?"

Мы можем прописать массив с where:
$articles = DB::table('articles')->select('name', 'id', 'text')
->where([
['id', '>', 2],
['name', 'like', 'test%', 'or']
])
->get();

Метод orWhere()
$articles = DB::table('articles')->select('name', 'id', 'text')
->where('id', '>', 2)
->where('name', 'like', 'test%', 'or')
->
orWhere('id', '<', 1)
->get();
Запрос будет выглядеть так: "select `name`, `id`, `text` from `articles` where `id` > ? or `name` like ? or `id` < ?"


Фильтрация between. Выберем статьи между 1 и 5:
$articles = DB::table('articles')->whereBetween('id', [1,5])->get();
Запрос будет выглядеть так: "select * from `articles` where `id` between ? and ?"
Отрицание в between:
$articles = DB::table('articles')->whereNotBetween('id', [1,5])->get();

Where + in:
$articles = DB::table('articles')->whereIn('id', [1,5])->get();
Запрос будет выглядеть так: "select * from `articles` where `id` in (?, ?)"

$articles = DB::table('articles')->whereNotIn('id', [1,5])->get();

Группировка значений:
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();

Лимит:
Метод take() указывает сколько элементов нужно выбрать из БД.
$articles = DB::table('articles')->take(4)->get();
Запрос будет выглядеть так: "select * from `articles` limit 4"

Метод skip() пропускает записи:
$articles = DB::table('articles')->take(4)->skip(2)->get();
Запрос будет выглядеть так: "select * from `articles` limit 4 offset 2"

Вставка данных в БД

Вставка нескольких записей:
DB::table('articles'->insert(
[
['name' => 'Sample blog post 5', 'text' => 'Text of Sample blog post 5'],
['name' => 'Sample blog post 6', 'text' => 'Text of Sample blog post 6']
]
);

Вставка одной записи:
DB::table('articles')->insert(['name' => 'Sample blog post 5', 'text' => 'Text of Sample blog post 5', 'img' => 'pic5.jpg']);
Узнаем идентификатор последней добавленной записи insertGetId:
$result = DB::table('articles')->insertGetId(['name' => 'Sample blog post 6', 'text' => 'Text of Sample blog post 6', 'img' => 'pic6.jpg']);

Обновление информации:
DB::table('articles')->where('id', 13)->update(['name'=>'Sample blog post 61']);

Метод update возвращает количество затронутых записей.
$result = DB::table('articles')->where('id', 13)->update(['name'=>'Sample blog post 62']);
dump($result); // 1

Удаление данных:
$result = DB::table('articles')->where('id', 13)->delete();
dump($result); // 1


Объединение таблиц
$users = DB::table('users')
->leftJoin('posts', 'users.id', '=', 'posts.user_id')
->get();



Комментариев нет:

Отправить комментарий

Materialize-css. Футер

Сделаем футер и прижмем к низу страницы. Документация: https://materializecss.com/footer.html