24
تشکر

Laravel: کار با Eloquent

Laravel

Laravel

در دو مطلب قبلی نحوه کار با دیتابیس را یاد گرفتیم و میتوانیم همه عملیات های روی دیتابیس را از طریق لاراول انجام دهیم بدون اینکه به صورت مستقیم از کدهای SQL استفاده کنیم. اما برای کار با دیتابیس در لاراول بهترین گزینه استفاده از Eloquent است. Eloquent فقط برای کار با یک جدول است و نمیتوان از دستورهایی مانند join یا group استفاده کرد و برای این عملیات ها باید از روش معمول که در مطلب قبلی گفته شد استفاده کنیم.

در ادامه مطلب همراه ما باشید…

راه اندازی یک Eloquent

برای استفاده از یک جدول در Eloquent ابتدا باید یک کلاس مشتق شده (extends) از Eloquent در مسیر app/models بسازیم.

برای مثال ما یک جدول به نام posts داریم، پس به مسیر گفته شده می‌رویم و یک فایل به نام Post.php میسازیم و درون این فایل کدهای زیر را قرار میدهیم.

<?php

class Post extends Eloquent { }
&#91;/php&#93;</div>

همانطور که در کد بالا میبینید ما یک کلاس مشتق شده از Eloquent ساختیم. حالا میتوانیم از این جدول با کلاس <span class="en-words">Post</span> استفاده کنیم. اما Laravel چگونه جدول <span class="en-words">posts</span> را شناسایی میکند. برای اینکار Laravel به نام کلاسی که شما ساخته‌اید یک <span class="en-words">s</span> اضافه میکند و جدول را شناسایی میکند. برای مثال ما در اینجا جدول <span class="en-words">posts</span> و یک کلاس <span class="en-words">Post</span> داریم پس Laravel یک <span class="en-words">s</span> به نام کلاس اضافه میکند و می‌شود <span class="en-words">posts</span> ، یا جدول <span class="en-words">users</span> و کلاس <span class="en-words">User</span> و به همین صورت.

اما اگر نام جدول شما با اضافه کردن یک <span class="en-words">s</span> به آخر آنهم مشابه نام کلاس نمیشود میتوانید نام آن را مستقیماً در خود کلاس تعریف کنید. برای مثال نام جدول من <span class="en-words">myPosts</span> است پس کلاس <span class="en-words">Post</span> را به صورت زیر مینویسم.
<div class="mycode">[php]
<?php

class Post extends Eloquent {

  protected $table = 'myPosts';
}
&#91;/php&#93;</div>

نکته: Laravel در کلاس Eloquent دو فیلد با نوع <span class="en-words">datetime</span> برای همه جدول ها را در نظر میگیرد: <span class="en-words">carated_at</span> و <span class="en-words">updated_at</span> . یعنی اگر جدول شما دارای این دو فیلد نباشد به خطا برمی خورید. اما اگر نمی خواهید از این دو فیلد در جدول خود استفاده کنید میتوانید خصوصیت <span class="en-words">timestamps</span> را برابر <span class="en-words">false</span> کنید. مانند زیر:
<div class="mycode">[php]
<?php

class Post extends Eloquent {

  public $timestamps = false;
}
&#91;/php&#93;</div>

نکته دو: سعی کنید همیشه یک فیلد در همه جدولهایتان با نام id و به صورت <span class="en-words">primary key</span>, <span class="en-words">auto increment</span> داشته باشید، در غیر اینصورت احتمال اینکه به مشکل برخورید زیاد است و اینکار را اگر از Laravel هم استفاده نمیکنید انجام دهید.

شما میتوانید به همین صورت هر تعداد جدولی که میخواهید را اضافه کنید و کدنویسی راحتتری با Eloquent داشته باشید.
<h2>استفاده از Eloquent</h2>
<h3>متد find</h3>
توسط این متد میتوانید یک سطر از جدول را بر اساس <span class="en-words">id</span> مورد نظر بگیرید. برای مثال در کد زیر ما سطری با <span class="en-words">id=45</span> را از دیتابیس گرفتیم و از آن استفاده کردیم. خروجی این متد یک شی است.
<div class="mycode">[php]
$post = Post::find($id);
$name = $post -> name;

متد all

همانطور که از اسم این متد انتظار می‌رود، خروجی آن به صورت آرایه و تمام سطرهای جدول را برمیگرداند.

$posts = Post::all();
foreach($posts as $post) {
  echo $post -> content;
}

متد paginate

Laravel به صورت شگفت انگیزی دارای ویژگی صفحه بندی بسیار آسانی است. کافیست به جای متد all از متد paginate استفاده کنید و یک عدد به عنوان تعداد نمایش سطرها در هر صفحه بدهید، به این صورت Laravel به صورت خودکار صفحه بندی را برای شما انجام میدهد. همچنین توسط متد links باید شماره های صفحات را نیز چاپ کنید.

$posts = Post::paginate(10);
         .
         .
         .
$posts -> links();

متدهای معمول

متدهایی مانند where یا orWhere نیز در Eloquent هستند. برای مثال ما در کد زیر پست هایی را که نویسنده آن احمد باشد را درخواست میکنیم و همچنین آن‌ها را بر اساس فیلد تاریخ مرتب میکنیم.

$posts = Post::where('author', 'ahmad') 
               -> orderBy('date', 'desc') 
               -> get();

در کد بالا میتوانید به جای استفاده از متد get که همه رکوردها را برمیگرداند از متد first که سطر اول را برمیگرداند یا متد paginate که صفحه بندی میکند و یا متد count که تعداد سطرها را برمیگرداند استفاده کنید.

متد Insert

در‌ واقع در Eloquent ما متد insert نداریم. در Eloquent ما یک سطر را new میکنیم و در نهایت save میکنیم. به عنوان مثال در کد زیر ما یک سطر جدید به جدول اضافه میکنیم.

$post = new Post;

$post -> name = 'Ahmad';
$post -> content = 'some content...';
$post -> date = new DateTime;

$post -> save();

متد Update

در اینجا هم ما متد update نداریم. برای Update کردن ابتدا سطر مورد نظر را به یکی از شیوه‌های گفته شده انتخاب میکنیم سپس با استفاده از متد save تغییرات را ذخیره میکنیم. برای مثال در کد زیر ما پستی را که نام آن CSS است انتخاب میکنیم، سپس نویسنده آن را تغییر میدهیم و دوباره درون دیتابیس ذخیره میکنیم.

$post = Post::where('name', 'CSS') -> first();

$post -> name = 'Ali';

$post -> save();

متد delete

این متد بر خلاف دو متد قبلی وجود دارد! به عنوان نمونه در کد زیر ما پست هایی را که archive آن‌ها برابر یک است را حذف میکنیم.

$posts = Post::where('archive', 1) -> delete();

نتیجه‌ گیری

متدها و ویژگی های گفته شده تنها بخشی از Eloquent بود و البته رایجترین آن‌ها بود. برای مطلع شدن و استفاده از ویژگی‌های دیگر میتوانید به اسناد Laravel مراجعه کنید.

با تمام شدن بخش دیتابیس وارد بخش Controllerها می‌شویم که کار با Routeها که در جلسات اول به آن اشاره شد بسیار آسان میکند.

این مطلب از سری مطالب، آموزش فریم ورک Laravel است
  • محمد می‌گه:

    سلام
    ممنون از مطلب خوبتون. من یه پروژه با فریم ورک لاراول دارم . میخوام بدونم میتونید کمکم کنید بخش هایی از این پروژه رو میخوام تغییر بدم. هزینه اش هم مورد نداره
    ممنون

  • سینا می‌گه:

    سلام دوستان
    fuelphp و laravel در صدر قرار دارند….
    ci و yii هم پشت سرشون….

  • etc می‌گه:

    فریمورک مثل اتومبیل میمونه!
    مثلاً شما با 405 میری تو خیابونای شهر م رانندگی میکنی و مشکلی نداری
    اما وقتی میخوای رالی شرکت کنی به یه ماشین تقویت شده ی ؛ حرفه ای نیاز دارید!
    و اگه با ماشین تقویت شده برید توی خیابونای عادی ,بنزین زیاد مصرف میکنه و…در نهایت به صرفه نیست!
    پس برنامه نویس خوب کسیه که با هر فریمورکی سریع ارتباط برقرار کنه حالا اگه توی همشون سینیور یا حرفه ای بشه که خیلی عالی , نشدم زوم کنه رو یکی از این جدیدا!
    بدونه چی کجا به کارش میاد.تعصب رو بندازه دور …
    فقط با جوملا کار نکنه :)
    من کدایگنایتر رو خیلی دوست دارم ,ایــ مَرده,لاراول خیلی باحاله و نرمه ,سیمفونی یه چیز دیگست ولی به نظرم سخته , زند هم کار نکردم!
    جاتون خالی الانم دارم قالب مینویسم .

  • سینا می‌گه:

    سلام من مدت هاست دنبال یه فریم ورک خوب پی اچ پی میگردم.
    نمیدونم کدوم رو انتخاب کنم:
    لاراول
    سیمفونی
    فالکون
    کداینتیجر
    کیک
    زند
    yii
    و خیلی های دیگه.
    ظاهرا لاراول خیلی محبوبه ولی برنامه نویس های حرفه ای میگن استاندارد نیست و خیلی مشکل داره..
    میشه یه مطلب درمورد مقایسه این ها بذارین.
    یا دوستان دیگه نظرشون رو بگن.

    • محمد جهانی می‌گه:

      من برنامه‌نویس حرفه‌ای نیستم ولی مدتی هستش که با لاراول کار میکنم و مشکلی درش ندیدم و چند پروژه رو به خوبی و با موفقیت باهاش به اتمام رسوندم. لاراول فریمورک بسیار ساده و خوبیه و پشتیبانی و پکیج‌های بسیار خوبی داره و بر اساس بنچمارک‌ها، بازدهیش از فریمورک‌هایی مثل یی، زِند، کیک و سیمفونی بالاتر هستش. اگه نیاز به فریمورکی ساده برای شروع دارید، من لاراول رو پیشنهاد میدم. اما اگر از قبل زمینه کار با فریمورکی دارید، فالکُن رو پیشنهاد میدم که بنا بر خاص بودنش، حدود ۵ برابر از لاراول سریع‌تر هستش. کُد ایگنایتر به دلیل قدیمی بودن و عدم به روز رسانی و استفاده از ویژگی‌های جدید پی‌اِچ‌پی، پیشنهاد نمیشه.

  • جواد می‌گه:

    سلام، ممنون از آموزش های خوبت
    مشکل اساسی که من با لاراول پیدا کردم حجم بالاشه! از کامپوزر که نصب می کنم حدود 30 مگ میشه، چه کنم که با حداقل حجم نصب شه، میشه حجمشو به زیر 10 مگ رسوند؟
    و یه درخواست دیگه: یه cms خوب و رایگان بر پایه لاراول4 معرفی کنید.

    سپاس

    • محمد جهانی می‌گه:

      برا یه فریم‌ورک کامل، اونقدرام بالا نیستش. مشکلتون با حجمش چیه؟
      در مورد CMS هم من یکی دو مورد دیدم که زیاد خوب نیستند. ولی خب اگه نیاز به یه CMS قوی برای گسترش امکانات و استفاده به عنوان فریم‌ورک دارید، دروپال رو پیشنهاد میکنم. در غیر این صورت برای وبسایت‌ها و وبلاگ‌های عادی، وردپرس انتخاب خیلی خوبیه. ضمناً نسخه ۸ دروپال که قراره به زودی به صورت نهایی منتشر بشه، بر پایه فریم‌ورک Symphony 2 نوشته شده و برای گسترش بسیار خوبه. سیمفونی فریم‌ورکیه که لاراول نیز بر پایه اون نوشته شده.

    • جواد می‌گه:

      ممنون، شرکت ها دیگه وردپرسو دوست ندارن، قصد دارم یه cms ساده بر پایه لاراول رو توسعه بدم، برای همین 30 مگ خیلی بده، البته یه cms بر پایه ci آماده کردم ولی اینقد گفتن ci ضعیفه که از چشم افتاد. به هر حال ممنون، منتظر آموزش های بعدی شما هستمو به شدت پیگیری می کنم.

  • محمد جهانی می‌گه:

    مرسی محسن جان خسته نباشی. فقط در مورد اون بخش که گفتی یه دونه s به اسم مدل اضافه میکنه، این همیشه درست نیست. در واقع اسم جدول پیشفرض مدل‌ها، جمع اون مدل هستش. مثلاً برای مدل City جدول cities در نظر گرفته میشه.


  • نظرات این مطلب بسته است.