رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش کار با دیتابیس در لاراول 5
#1
مباحث پایه کار با دیتابیس


یکی از مزیت های فریم ورک لاراول کار با دیتابیس آن است که بسیار ساده است و متدهای زیادی برای عملیات های مختلف دارد. برای اعمال تنظیمات دیتابیس خود باید داخل فایل env. و همچنین در پوشه config و فایل database.php تنظیمات مورد نظر خود را اعمال کنید. به طور پیش فرض لاراول از mysql استفاده می کند اما از دیتابیس های MySQL , Postgres, SQLite و SQL Server هم پشتیبانی می کند و می توانیم از هر یک از انها استفاده کنیم.


اجرای کوئری با کلاس DB



در لاراول به سادگی می توانیم با استفاده از کلاس DB و نوشتن کوئری به صورت prepared statements عمل مورد نظرمان را انجام دهیم.





با استفاده از متد select می توانیم رکوردهای داخل یک جدول را بازیابی کنیم و خروجی آن یک آرایه است. پارامتر دوم متد select هم یک آرایه از مقادیر است که که در صورتی که کوئری نیاز به bind کردن مقداری داشته باشد از آن استفاده میکنیم.نحوه استفاده از آن را به دوشکل مختلف می بینید:
کد پی‌اچ‌پی:
$results DB::select('select * from users where id = ?', [1]);
 
$results DB::select('select * from users where id = :id', ['id' => 1]); 


insert , update , delete

برای درج در جدول از متد insert و برای به روز رسانی از update و حذف از جدول delete را استفاده میکنیم :
کد پی‌اچ‌پی:
DB::insert('insert into users (id, name) values (?, ?)', [1'Dayle']);
 
DB::update('update users set votes = 100 where name = ?', ['John']);
 
DB::delete('delete from users where id =:id', ['id' => 1]); 

نکته : متدهای update و delete تعداد رکوردهایی که با این کوئری تغییر یافتند یا حذف شدند را برمیگرداند.


اگر کوئری غیر از ۴ عمل اصلی دیتابیس بود می توانیم از متد ststement استفاده کنیم :
کد پی‌اچ‌پی:
DB::statement('drop table users'); 

برای تراکنش هم می توانید از متد transaction استفاده کنید و عملیات مورنظرتان را داخل تابع که به آن می دهیم را انجام دهیم. در صورتی که هریک از کوئری ها با خطایی مواجه شوند و اجرا نشوند به ظور اتوماتیک تمام کوئری های اجرا شده به عقب بر میگردند که مناسب برای عملیات های مالی می باشد.


کد پی‌اچ‌پی:
DB::transaction(function()
{
 
   DB::table('users')->update(['votes' => 1]);
 
 
   DB::table('posts')->delete();
}); 

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

کد پی‌اچ‌پی:
$users DB::connection('foo')->select(...); 


کار با دیتابیس با Query Builder


روش بهتر و آسانتر برای کار با دیتابیس در لاراول به جای نوشتن کامل کوئری استفاده از Query Builder است. شما می توانید اکثر عملیات های دیتابیس را در برنامه تان انجام بدهید و این کوئری ها در همه دیتابیس هایی که لاراول ساپورت می کند کار کند. در ضمن کوئری بیلدر لاراول از bind کردن پارامترها استفاده می کند که برنامه تان را در برابر حملات SQL Injection محافظت میکند.

SELECT
برای انتخاب تمامی رکوردهای یک جدول ابتدا نام جدول موردنظر را به متد table و سپس با متد get رکوردها را واکشی میکنیم.

کد پی‌اچ‌پی:
$users DB::table('users')->get();
 
foreach (
$users as $user)
{
 
   var_dump($user->name);


برای استفاده از شرط در کوئری از متد where استفاده می کنیم و این متد سه پارامتر میگیرد که اولی نام ستون موردنظر و دومی operator شرط (= , > , <, <= , ...) و سومین پارامتر هم مقدار موردنظر است. در صورتی که پارامتر دوم را ننویسیم به صورت پیش فرض عملگر = در نظر گرفته می شود. متد  first هم اولین رکورد که با شرط فوق همخوانی داشته باشد را برمیگرداند که برای بازیابی یک رکورد استفاده می شود. در صورتی که چند رکورد را بخواهیم بازیابی کنیم از متد get استفاده میکنیم.

کد پی‌اچ‌پی:
$user DB::table('users')->where('name''John')->first();
 
var_dump($user->name);$users DB::table('users')->where('votes''>'100)->get(); 


در صورتی که بخواهیم مقدار یک ستون خاص را که در یک شرط صدق میکند را بازیابی کنیم از متد pluck استفاده و نام ستون را به آن میدهیم. اگر بخواهیم لیست مقادیر یک ستون را واکشی کنیم از متد lists استفاده و مقدار ستون را به عنوان پارامتر به آن میدهیم که خروجی آن یک آرایه است و می توانیم نام ستون دیگری را هم به عنوان پارامتر دوم به آن بدهیم تا کلید آرایه مقادیر ان ستون باشند.


کد پی‌اچ‌پی:
$name DB::table('users')->where('name''John')->pluck('name');
 
$roles DB::table('roles')->lists('title');
 
$roles DB::table('roles')->lists('title''name'); 

استفاده از OR یا AND برای جدا کردن شرط ها 

برای این کار کافی است بعد از متد where که نوشتیم متد orWhere را استفاده کنیم :

کد پی‌اچ‌پی:
$users DB::table('users')
 
                   ->where('votes''>'100)
 
                   ->orWhere('name''John')
 
                   ->get();عبارت بالا معادل کوئری زیر است :
SELECT FROM users WHERE votes 100 OR name 'john' 


اگر دوباره از متد where استفاده کنیم معادل AND در نظر گرفته می شود.


متدهای بسیار زیادی وجود دارند که به علت طولانی شدن مبجث و وجود مثال ها به ظور واضح در داکیومنت برای اطلاعات بیشتر به اینجا مراجعه کنید


استفاده از متدهای جادویی شرط 
روش بهتر و با کدنویسی کمتر استفاده از متدهای جادویی هست. در مثال های زیر کوئری های معادل آنها را هم نوشته ام :

کد پی‌اچ‌پی:
//SELECT * FROM users WHERE id=1 LIMIT 1;
$admin DB::table('users')->whereId(1)->first(); 
 
//SELECT * FROM users WHERE id=2 AND email = 'john@doe.com' LIMIT 1;
$john DB::table('users')
 
                   ->whereIdAndEmail(2'john@doe.com')
 
                   ->first(); //
 
//SELECT * FROM users WHERE name='Jane' OR age = 22 LIMIT 1;
$jane DB::table('users')
 
                   ->whereNameOrAge('Jane'22)
 
                   ->first(); 


استفاده از Order By و Group By و Having با کوئری بیلدر

کد پی‌اچ‌پی:
$users DB::table('users')
 
                   ->orderBy('name''desc')
 
                   ->groupBy('count')
 
                   ->having('count''>'100)
 
                   ->get(); 



همچنین می توانیم از LIMIT به همراه آفست در کوئری استفاده کنیم. 
کد پی‌اچ‌پی:
$users DB::table('users')->skip(10)->take(5)->get(); 


در مثال بالا کوئری میگوید که از رکورد دهم در جدول users راانتخاب کن و تا ۵ رکورد را واکشی کن. (شماره گزاری رکوردها از صفر شروع میشود)


JOIN کردن 

با متد join می توانید دو یا چند جدول را باهم JOIN کنید. این متد ۴ پارامتر می گیرد که اولی جدولی که میخواهیم به آن پیوند بزنیم و پارامترهای بعدی فیلدهایی که باید باهم مساوی باشند را قرار میدهیم.


کد پی‌اچ‌پی:
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(); 


در مثال بالا به سه جدول orders, users, contacts پیوند زده شده است.


با کوئری بیلدر می توانیم با توابع جمعی (count, 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'); 


درج کردن (INSERT)

با استفاده از متد insert می توانیم در جدول مورد نظر مقادیری را درج کنیم. مقادیر را در آرایه قرار می دهیم و به عنوان پارامتر به آن می دهیم. کلیدهای آرایه نام ستون جدول مورد نظر است.


کد پی‌اچ‌پی:
DB::table('users')->insert(
 
   ['email' => 'john@example.com''votes' => 0]
);
 
$id DB::table('users')->insertGetId(
 
   ['email' => 'john@example.com''votes' => 0]
);
 
DB::table('users')->insert([
 
   ['email' => 'taylor@example.com''votes' => 0],
 
   ['email' => 'dayle@example.com''votes' => 0]
]); 



اگر در جدولتان فیلد id به صورت Auto-increment است می توانید از متد insertGetId استفاده کنید که بعد از درج کوئری id که تولید شده را به عنوان خروجی برمیگرداند. در مثال سوم در بالا هم همانظور که می بینید در صورتی که بخواهید چندین رکورد را باهم درج کنید کافیست رکوردها را به عنوان پارامتر به متد insert بدهیم و با ویرگول ازهم جدا کنیم.



به روزرسانی (UPDATE) 
با استفاده از متد update که یک آرایه به ان میدهیم که کلید های آن نام ستون موردنظر در جدول و مقادیر آن هم مقدار جدید می باشد رکوردها را آپدیت کنیم.


کد پی‌اچ‌پی:
DB::table('users')
 
           ->where('id'1)
 
           ->update(['votes' => 1]); 


همچنین می توانیم با متد increment مقدار ستونی را یک واحد افزایش دهیم یا با ذکر یک پارامتر دوم تعداد افزایش را به طور مثال در مثال زیر ۵ واحد مشخص کنیم. متد decrement هم مقدار را کاهش می دهد و مانند متد قبلی عمل میکند.


کد پی‌اچ‌پی:
DB::table('users')->increment('votes');
 
DB::table('users')->increment('votes'5);
 
DB::table('users')->decrement('votes');
 
DB::table('users')->decrement('votes'5);
DB::table('users')->increment('votes'1, ['name' => 'John']); 


در مثال آخر هم همانظور که می بینید هم می توانیم عمل افزایش را انجام دهیم و هم آپدیت سایر مقادیر ستون های جدول را که به عنوان پارامتر سوم و از نوع آرایه به آن می دهیم.



حذف کردن (Delete)
در لاراول با استفاده از متد delete می توانیم رکوردی یا همه رکوردهای جدول را حذف کنیم. اگر از شرط استفاده نکنیم همه رکوردهای جدول حذف می شوند. با استفاده از متد truncate هم می توانیم همه مقادیر یک جدول را حذف کنیم با این تفاوت که truncate هیچ شرطی نمیگیره و سریعتر از delete هست یا تفاوت دیگر آن این است که id های اختصاص داده شده به رکوردها را هم reset میکند ولی در delete اینگونه نیست.


کد پی‌اچ‌پی:
DB::table('users')->where('votes''<'100)->delete();
DB::table('users')->delete();
DB::table('users')->truncate(); 


با استفاده از متد union می توانیم دو کوئری را باهم اجتماع کنیم :

کد پی‌اچ‌پی:
$first DB::table('users')->whereNull('first_name');
 
$users DB::table('users')->whereNull('last_name')->union($first)->get(); 


قفل کردن جدول هنگام اجرای عملیات

در صورتی که قصد دارید در هنگام انجام عملیات SELECT جدول قفل شود میتوانیم به صورت زیر عمل کنیم :


کد پی‌اچ‌پی:
DB::table('users')->where('votes''>'100)->sharedLock()->get();
 
DB::table('users')->where('votes''>'100)->lockForUpdate()->get(); 


با استفاده از متد sharedLock جدول را به ظور کامل قفل می کنیم و با متد lockForUpdate جدول را هنگام عملیات SELECT فقط برای به روزرسانی قفل می کنیم.


برای دیدن مثال های بیشتر به اینجا مراجعه کنید



(با تشکر از حامد آریان)
قوانین انجمن لاراولیستا  | شماره تماس :‌09124783045 |‌ تلگرام :‌ 09377869283
پاسخ
#2
با سلام

چطور می تونم کلاس DB رو به مدلم اضافه کنم.

با این خطا مواجه شدم


کد پی‌اچ‌پی:
FatalErrorException in news.php line 44: Class 'App\DB' not found 

باتشکر از زحمات شما.
کد پی‌اچ‌پی:
<?php namespace App;
use 
Illuminate\Database\Eloquent\Model;

class 
news extends Model
{
.
.
.
 
   public function newsAll()
 
   {

 
       return DB::table('news')->get();
 
   }
.
.
.

پاسخ
#3
باید ابتدای کنترلر این کلاسو ایمپورت کنید
کد پی‌اچ‌پی:
use DB
پاسخ
#4
(11-29-2015, 03:45 PM)hamo نوشته:  باید ابتدای کنترلر این کلاسو ایمپورت کنید


کد پی‌اچ‌پی:
use DB

این کار رو در مدلم انجام دادم.
اما اصلا چیزی به نام DB نمیشناسه.
کد پی‌اچ‌پی:
Undefined Class DB,Declaration of refrenced class is not found in built-in-library and project file 

شما درست گفتید، اما کلاس باید به طور کامل به مدلم اضافه میشد.
کاملش به صورت زیر بود.
کد پی‌اچ‌پی:
use Illuminate\Support\Facades\DB
سپاس گزارم.
پاسخ
#5
Brick 
با سلام خدمت شما و با تشکر از سایت خوبتون ازتون خواهش میکنم جواب منو بدین
من در لاراول برای کار با دیتابیس از روش اولی که گفتین یعنی $laravel = DB:Confusedelect("select * from `table`"); استفاده میکنم حالا میخوام از توابع mysqli مثل تابع max استفاده کنم به این صورت $laravel = DB:Confusedelect("select max(`id`) from `table`"); حالا برای چاپ max(`id`) چیجور باید عمل کنم؟؟؟؟
پاسخ
#6
(12-24-2015, 08:44 PM)farshad نوشته:  با سلام خدمت شما و با تشکر از سایت خوبتون ازتون خواهش میکنم جواب منو بدین
من در لاراول برای کار با دیتابیس از روش اولی که گفتین یعنی $laravel = DB:Confusedelect("select * from `table`"); استفاده میکنم حالا میخوام از توابع mysqli مثل تابع max استفاده کنم به این صورت $laravel = DB:Confusedelect("select max(`id`) from `table`"); حالا برای چاپ max(`id`) چیجور باید عمل کنم؟؟؟؟

کد پی‌اچ‌پی:
$id DB::table('table')->max('id'); 
پاسخ
#7
با سلام

مشکل این کد چیه؟
کد پی‌اچ‌پی:
<?php namespace App\Http\Controllers;

use 
Illuminate\Foundation\Bus\DispatchesCommands;
use 
Illuminate\Routing\Controller as BaseController;
use 
Illuminate\Foundation\Validation\ValidatesRequests;
use 
Illuminate\Support\Facades\DB;


class 
Controller extends BaseController {

 use 
DispatchesCommandsValidatesRequests;
 public function 
testmethod()
 {
 
    if(DB::select('select * from user where username = :username1 ', ['username1' =>$txtuser]))
 
     {
 
        return view('loginuser1',['name1'=>$txtuser])
 
     }

 }


هر موقع دستورات داخل if رو میذارم برنامه ارور میده
پاسخ
 


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش اعتبار سنجی در لاراول 5 alihossein 4 774 11-20-2016, 07:12 AM
آخرین ارسال: حمید رﺽا کمالی
  آموزش روتینگ routing در لاراول 5 alihossein 2 1,129 11-12-2016, 04:37 AM
آخرین ارسال: حمید رﺽا کمالی
  طراحی صحیح دیتابیس برای محصولات فروشگاه shariaty 1 117 10-31-2016, 05:40 AM
آخرین ارسال: LavarelUser
  آموزش Migration در لاراول 5 alihossein 9 1,167 08-15-2016, 04:17 PM
آخرین ارسال: Naser.SherafatiNia
  آموزش فارسی لاراول ۵ alihossein 4 2,865 07-22-2016, 04:16 PM
آخرین ارسال: elham_malekmohamadi
  # سوال : آموزش ساخت ربات تلگرام با پکیج irazasyed/telegram-bot-sdk Bvk.Programmer 0 235 04-25-2016, 04:54 PM
آخرین ارسال: Bvk.Programmer
  درخواست آموزش کار با پکیج intervention/image Bvk.Programmer 6 492 04-18-2016, 05:52 PM
آخرین ارسال: hamo
Rainbow آموزش : پکیچ کاربردی ajax-blade Bvk.Programmer 0 201 02-15-2016, 06:04 PM
آخرین ارسال: Bvk.Programmer
  سوال : واکشی اطلاعات از دیتابیس و استفاده در کنترلر Bvk.Programmer 3 179 02-08-2016, 03:15 PM
آخرین ارسال: smartDeath
  آموزش Session ها در لاراول 5 alihossein 1 664 01-29-2016, 12:33 PM
آخرین ارسال: SajadDP

پرش به انجمن:


کاربران در حال بازدید این موضوع: 1 مهمان

درباره انجمن فریم ورک لاراول

انجمن لاراولیستا به عشق توسعه دهنده ها و علاقمندان به این فریم ورک محبوب ایجاد شده و امیدواریم با نظرات خوبتون ما رو در بهبود کار یاری کنید. در ضمن خیلی هم خوشحال میشیم شما هم در توسعه این انجمن سهمی داشته باشید.