// DocumentValidator::addRule('QueryComplexity', new QueryComplexity(6)); // DocumentValidator::addRule('QueryDepth', new QueryDepth(1));
$articles = DB::table('articles')->get(); foreach ($articles as &$article) { $article->author = DB::table('users')->where('id', $article->author_id)->first(); }
DB::table('articles')->get()
as a result sends one request to the database, something like this:
SELECT * FROM articles;
SELECT * FROM users WHERE id = 1; SELECT * FROM users WHERE id = 2; SELECT * FROM users WHERE id = 3; SELECT * FROM users WHERE id = 4; SELECT * FROM users WHERE id = 5; ... SELECT * FROM users WHERE id = N;
$articles = DB::table('articles')->get(); $authors_ids = get_authors_ids($articles); $authors = DB::table('users')->whereIn('id', $authors_ids)->get(); foreach ($articles as &$article) { $article->author = search_author_by_id($authors, $article->author_id); }
SELECT * FROM articles; SELECT * FROM users WHERE id IN (1, 2, 3, 4, 5, ..., N);
'allUsers' => [ 'type' => Types::listOf(Types::user()), 'description' => ' ', 'resolve' => function () { return DB::select('SELECT * from users'); } ]
'countFriends' => [ 'type' => Types::int(), 'description' => ' ', 'resolve' => function ($root) { return DB::affectingStatement("SELECT u.* FROM friendships f JOIN users u ON u.id = f.friend_id WHERE f.user_id = {$root->id}"); } ]
use GraphQL\Deferred;
'countFriends' => [ 'type' => Types::int(), 'description' => ' ', 'resolve' => function ($root) { return new Deferred(function () use ($root) { return DB::affectingStatement("SELECT u.* FROM friendships f JOIN users u ON u.id = f.friend_id WHERE f.user_id = {$root->id}"); }); } ]
add
- Add user id to bufferload
- load the number of friends from the database for all users in the bufferget
- Get the number of friends of the user from the buffer <?php namespace App; /** * Class Buffer * * * * @package App */ class Buffer { /** * id * * @var array */ private static $ids = array(); /** * * * @var array */ private static $results = array(); /** * */ public static function load() { // , if (!empty(self::$results)) return; // $rows = DB::select("SELECT u.id, COUNT(f.friend_id) AS count FROM users u LEFT JOIN friendships f ON f.user_id = u.id WHERE u.id IN (" . implode(',', self::$ids) . ") GROUP BY u.id"); foreach ($rows as $row) { self::$results[$row->id] = $row->count; } } /** * id * * @param int $id */ public static function add($id) { // id , if (in_array($id, self::$ids)) return; self::$ids[] = $id; } /** * * * @param $id * @return int */ public static function get($id) { if (!isset(self::$results[$id])) return null; return self::$results[$id]; } }
use App\Buffer;
'countFriends' => [ 'type' => Types::int(), 'description' => ' ', 'resolve' => function ($root) { // id Buffer::add($root->id); return new Deferred(function () use ($root) { // ( ) Buffer::load(); // return Buffer::get($root->id); }); } ],
Source: https://habr.com/ru/post/329408/