آموزش لاراول – Query Builder

  • خانه
  • آموزش لاراول – Query Builder
Image تحقیقات

آموزش لاراول – Query Builder

با سلامی دیگر خدمت دوستان عزیزم

مبحث امروزمون برمیگرده به  Query Builder ، که در واقع همان query هایی هست که ما نیاز داریم تا با دیتابیس خودمون تعامل داشته باشیم مانند Select,insert,Join , ….

فریم ورک لاراول  خوشبختاته تو این قضیه هم دست مارو باز گذاشته و امکانات خوبی رو فراهم کرده برای برنامه نویسان که در ادامه باهم بررسی می کنیم .

مواردی که تو این جلسه یادمیگیریم :

 

  • Selects
  • Joins
  • Advanced Wheres
  • Aggregates
  • Raw Expressions
  • Inserts
  • Updates
  • Deletes
  • Unions
  • Pessimistic Locking
  • Caching Queries

 

دستور Selects :

همان طور که با این دستور در mysql آشنا هستید ، رکوردهای جدول رو برای ما برمیگردونه .

$users = DB::table('users')->get();

foreach ($users as $user)
{
    var_dump($user->name);
}

 

 امروز اکثر کار ما با کلاس DB در لاراول هست و درواقع متدهای مختلف اون رو بررسی می کنیم. 

همانطور که در کد بالا مشاهده می کنید از کلاس DB متد Table,get رو صدا زدیم و مقدار اون رو در متغیر user$ ریختیم و در نهایت اون رو با حلقه ی Foreach چاپ کردیم.

 

بازیابی یک سطر از جدول :

برای اینکه تنها یک سطر از جدول رو بازیابی کنید از دستور زیر می توانید استفاده نمایید :

$user = DB::table('users')->where('name', 'John')->first();

var_dump($user->name);

 

بازیابی یک ستون (فیلد از جدول) :

$name = DB::table('users')->where('name', 'John')->pluck('name');

در مثال بالا ما با استفاده از متد pluck تنها فیلد name را از رکورد مورد نظر بازیابی کردیم .

 

بازیابی لیستی از ستون ها (یک فیلد) :

گاهی تنها نیاز دارین که یک فیلد خاص رو از جدول برای تمام رکورد ها بازیابی کنید مثلا تمام عنوان پست های جدول رو و اونو نشون بدین.یه راه اش اینه که شما تمام ستون هارو بازیابی کنید و فقط عنوان هارو با حلقه foreach نمایش بدین و راه دوم مثال زیر هست که فقط یک فیلد رو تعیین می کنیم :

$roles = DB::table('roles')->lists('title');

متدها زیر هم میتونه در بعضی از مواقع به شما کمک کنه و کارتون رو راه بندازه :

$users = DB::table('users')->select('name', 'email')->get();

$users = DB::table('users')->distinct()->get();

$users = DB::table('users')->select('name as user_name')->get();

دستور Where :

همان طور که می دانید where برای ایجاد شرط در query ها استفاده می شه.در مثال زیر ما رکوردهایی که ID انها بیشتر از 10 باشن رو بازیابی می کنیم :

$users = DB::table('users')->where('id', '>', 10)->get();

اگر نیاز دارید که چند شرط رو قراربدین ، میتونید از کد زیر استفاده نمایید :

$users = DB::table('users')
                    ->where('votes', '>', 100)
                    ->orWhere('name', 'John')
                    ->get();

و یا مثلا شرطی قرار بدین که بین دو مقدار باشه :

$users = DB::table('users')
                    ->whereBetween('id', array(1, 100))->get();

و یا حتی شرطی که بین دو مقدار نباشه. مثلا رکوردهایی که id اون ها بین این دو مقدار نباشه :

$users = DB::table('users')
                    ->whereNotBetween('id', array(1, 100))->get();

یا ممکنه نیاز داشته باشین رکوردهایی رو استخراج کنید که Id انها یا 1 باشه یا 2 و یا 3 :

$users = DB::table('users')
                    ->whereIn('id', array(1, 2, 3))->get();

$users = DB::table('users')
                    ->whereNotIn('id', array(1, 2, 3))->get();

فریم ورک لاراول این امکان رو برامون فراهم میکنه که رکوردهایی که مقدار Null دارند رو بتونیم به راحتی استتخراج کنیم :

$users = DB::table('users')
                    ->whereNull('updated_at')->get();

استفاده از Order By, Group By, And Having رو در mysql حتما باهاش کار کردین ، در لاراول به این صورت است :

$users = DB::table('users')
                    ->orderBy('name', 'desc')
                    ->groupBy('count')
                    ->having('count', '>', 100)
                    ->get();

 برای اضافه کردن Offset & Limit به query میتونید از کد زیر استفاده نمایید :

$users = DB::table('users')->skip(10)->take(5)->get();

دستور Joins

 از join ها در sql هم برای ترکیب دو یا چند جدول استفاده میشه :

Basic Join Statement

DB::table('users')
            ->join('contacts', 'users.id', '=', 'contacts.user_id')
            ->join('orders', 'users.id', '=', 'orders.user_id')
            ->select('users.id', 'contacts.phone', 'orders.price')
            ->get();

Left Join Statement

DB::table('users')
        ->leftJoin('posts', 'users.id', '=', 'posts.user_id')
        ->get();

 حتی برای join های پیشرفته تر میتونید از مثال های زیر استفاده نمایید :

DB::table('users')
        ->join('contacts', function($join)
        {
            $join->on('users.id', '=', 'contacts.user_id')->orOn(...);
        })
        ->get();

 برای ایجاد شرط در join ها میتوانید از 

where یا orWhere در کوئری خودتون استفاده کنید .مانند :
DB::table('users')
        ->join('contacts', function($join)
        {
            $join->on('users.id', '=', 'contacts.user_id')
                 ->where('contacts.user_id', '>', 5);
        })
        ->get();

 

استفاده از دستور Where به صورت پیشرفته (Advanced Wheres)

 بعضی موقع ها نیاز داریم تا کوئری هایی بزنیم که از شرط های پیچیده تر و در واقع تودرتو تشکیل شده است.

مثلا کد :

DB::table('users')
            ->where('name', '=', 'John')
            ->orWhere(function($query)
            {
                $query->where('votes', '>', 100)
                      ->where('title', '<>', 'Admin');
            })
            ->get();

 همان کاری را انجام میدهد که ما به وسیله ی کد زیر در sql انجام میدادیم :

select * from users where name = 'John' or (votes > 100 and title <> 'Admin')

 و یا کد زیر :

DB::table('users')
            ->whereExists(function($query)
            {
                $query->select(DB::raw(1))
                      ->from('orders')
                      ->whereRaw('orders.user_id = users.id');
            })
            ->get();

 همان کاری را انجام میدهد که که زیر در Sql انجام میدهد.(چک میکنیم آیا خروجی برگشت داده می شود یا خیر)

select * from users
where exists (
    select 1 from orders where orders.user_id = users.id
)

 

 توابع Aggregates

اگه یادتون باشه داخل Sql ما یه سری توابعی داشتیم مانند Max (بزگترین مقدار رو نشان میداد) Min(کوچک ترین مقدار رو نشان میداد) و ..

در فریم ورک لاراول هم میتوانیم این توابع را پیاده سازی و استفاده نماییم :

مثال های زیر ساده و روشن هستن :

$users = DB::table('users')->count();

$price = DB::table('orders')->max('price');

$price = DB::table('orders')->min('price');

$price = DB::table('orders')->avg('price');

$total = DB::table('users')->sum('votes');

دستور Inserts

 دستور insert هم که حتما باهاش آشنایی دارین برای وارد کردن اطلاعات داخل جدول مورد نظر است که در فریم ورک لاراول به طریق زیر پیاده سازی می شود :

DB::table('users')->insert(
    array('email' => 'john@example.com', 'votes' => 0)
);

 اگر بخواهیم چند رکورد را همزمان وارد جدول نماییم از دستور زیر استفاده می کنیم :

DB::table('users')->insert(array(
    array('email' => 'taylor@example.com', 'votes' => 0),
    array('email' => 'dayle@example.com', 'votes' => 0),
));

 و اگر جدول ما دارای فیلدی هست که مقدار ID اون فیلد رو Auto-Incrementing تعریف کردیم از 

insertGetId به جای insert استفاده می نماییم :
$id = DB::table('users')->insertGetId(
    array('email' => 'john@example.com', 'votes' => 0)
);

دستور Updates

برای ویرایش و آپدیت کردن فیلدهای جدول از دستور زیر استفاده می کنیم :

DB::table('users')
            ->where('id', 1)
            ->update(array('votes' => 1));

 در کد بالا با شرطی که قرار دادیم رکوردی با مقدار Id=1 را استخراج کردیم و در ادامه فیلد votes اون رکورد رو به مقدار 1 آپدیت کردیم .

 

Incrementing or decrementing

قابلت جالب دیگری که در فریم ورک لاراول  موجود است ، افزایش یا کاهش مقدار داخل فیلدهای جدول به مقدار تعیین شده است.

به مثال زیر دقت کنید :

DB::table('users')->increment('votes');

DB::table('users')->increment('votes', 5);

DB::table('users')->decrement('votes');

DB::table('users')->decrement('votes', 5);
  •  خط اول فیلد votes را به مقدار پیش فرض 1 واحد افزایش میدهد.
  • خط دوم فیلد votes را به مقدار تعیین شده 5 واحد افزایش میدهد.
  • خط سوم  فیلد votes را به مقدار پیش فرض 1 واحد کاهش میدهد.
  • خط چهارم فیلد votes را به مقدار تعیین شده 5 واحد کاهش میدهد.

 

مثال زیر رو دقت نمایید : در این مثال که ترکیبی است ، هم مقدار فیلد ID را افزایش میدهیم و هم مقدار فیلد name را ویرایش و اپدیت کردیم :

DB::table('users')->increment('id', 1, array('name' => 'John'));

دستور Deletes در لاراول

در آخر ،نوبت میرسه به دستورات مربوط به پاک کردن :

DB::table('users')->where('id', '<', 100)->delete();

دستور بالا رکوردهایی که ID ها کوچک تر از 100 است را پاک می کند.

DB::table('users')->delete();

 دستور بالا کل جدول users را پاک می نماید.

خب به نظرم تا اینجا کافی باشه.امیدوارم خوب تمرین کنید این دستورات رو.

موفق و پیروز باشید.