رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
آموزش Relationships جداول در لاراول 5
#1
ارتباطات (Relationships) 

در فریم ورک لاراول تقریبا همه جداول موجود در دیتابیس بایکدیگر ارتباط دارند. ارتباطات می تواند از انواع یک به یک و یک به چند و چند به چند باشد. در لاراول با Eloquent به راحتی می توانید این ارتباط ها را مدیریت و با آنها کار کنید. در این پست دو نمونه رایج ارتباط یک به چند (One-to-Many) و چند به چند (Many-to-Many) که اکثر ارتباطها در جداول دیتابیس به این صورت است را مثال خواهیم زد.

ارتباط One To Many
برای مثال یک وبلاگ را در نظر بگیرید که دارای یک جدول به نام posts و یک جدول هم به نام comments هست. هر پست در بلاگ می تواند دارای چند کامنت و هرکامنت هم فقط به یک پست تعلق دارد پس این ارتباط یک به چند است. 
داخل کلاس مدل Post (که سمت یک ارتباط است) ابتدا ارتباط به مدل Comment را با افزودن یک متد همنام با جدول متناظرش مثلا به نام comments به این صورت پیاده سازی میکنیم :

کد پی‌اچ‌پی:
class Post extends Model {
 
 
   public function comments()
 
   {
 
       return $this->hasMany('App\Comment');
 
   }
 



با استفاده از متد hasMany کلاسی که با آن ارتباط چندی دارد را به عنوان پارامتر به آن میدهیم.


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


کد پی‌اچ‌پی:
class Comment extends Model {
 
 
   public function post()
 
   {
 
       return $this->belongsTo('App\Post');
 
   }
 



اکنون همانند مثال زیر می توانید تمام کامنت های پستی با id برابر ۱ را بازیابی کنید. همچنین می توانید از سایر متدها همچون شرط هم استفاده کنید.


کد پی‌اچ‌پی:
$comments Post::find(1)->comments;
 
$comments Post::find(1)->comments()->where('title''=''foo')->first(); 


نکته : نام کلید خارجی باید به صورتی باشد که ابتدا نام جدولی که از آن ارجاع می شود بدون s و سپس کلمه id_ به انتهای آن افزوده شود مثلا برای مثال بالا کلید خارجی باید post_id باشد وگرنه باید در متد hasMany کلید خارجی را هم مشخص کنیم :


کد پی‌اچ‌پی:
return $this->hasMany('App\Comment''foreign_key'); 


ارتباط Many To Many

برای پیاده سازی این نوع ارتباط فرض کنید یک جدول به نام users داریم و یک جدول هم به نام roles. هر کاربر می تواند چندین نقش داشته باشد و هر نقش هم میتواند به چندین کاربر تعلق داشته باشد. پس باید یک جدول واسط هم برای این دو جدول به نام role_user داشته باشیم. دقت کنید نام این جدول باید ترکیبی از نام دوجدول قبلی اما بدون s آخر آنها باشد که با _ ازهم جدا شده اند. سپس کلید های خارجی user_id و role_id هم در این جدول ایجاد می شوند.
در مدل User یک متد همنام جدولی که با آن ارتباط دارد ایجاد میکنیم و سپس با استفاده از متد belongsToMany کلاس مدل Role را به آن میدهیم.


کد پی‌اچ‌پی:
class User extends Model {
 
 
   public function roles()
 
   {
 
       return $this->belongsToMany('App\Role');
 
   }
 



در کلاس مدل Role هم مانند بالا عمل میکنیم :


کد پی‌اچ‌پی:
class Role extends Model {
 
 
   public function users()
 
   {
 
       return $this->belongsToMany('App\User');
 
   }
 



حالا به راحتی می توانیم تمامی نقش های یک کاربر را بازیابی کنیم :


کد پی‌اچ‌پی:
$roles User::find(1)->roles



درج کردن در جدول رابطه دار

فرض کنید می خواهیم یک کامنت را در جدولcomments درج کنیم. همانطور که قبلا مثال زدیم جدول posts با جدول comments دارای ارتباط یک به چند است و ستون post_id در جدول comment کلید خارجی است. همانند مثال زیر می توانید به روش mass-assignment رکوردی را در ج کنید به طوری که در فیلد post_id به طوراتوماتیک با توجه به پست مورد نظر id آن ثبت خواهد شد.


کد پی‌اچ‌پی:
$comment = new Comment(['message' => 'A new comment.']);
 
$post Post::find(1);
 
$comment $post->comments()->save($comment); 

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


کد پی‌اچ‌پی:
public $guarded = ['id' 'post_id']; 

همچنین می توانید تعداد زیادی کامنت را هم به روش بالا درج کنید. هررکورد را داخل یک آرایه قرار می دهیم و همچنین به جای متد save از saveMany استفاده میکنیم.

کد پی‌اچ‌پی:
$comments = [
 
   new Comment(['message' => 'A new comment.']),
 
   new Comment(['message' => 'Another comment.']),
 
   new Comment(['message' => 'The latest comment.'])
];
 
$post Post::find(1);
 
$post->comments()->saveMany($comments); 


بعضی مواقع نیاز داریم که هنگام select کردن رکوردها خروجی را در قالب آرایه یا JSON داشته باشیم که Eloquent دارای متدهایی برای این کار می باشد.

با استفاده از متد toArray می توانیم خروجی هر کوئری را به یک آرایه تبدیل کنیم



کد پی‌اچ‌پی:
$user User::with('roles')->first();
 
return 
$user->toArray(); 


با متد toJson هم خروجی را به JSON تبدیل می کنیم :

کد پی‌اچ‌پی:
return User::find(1)->toJson(); 


لاراول 5 در Eloquent دارای مباحث بسیار زیادی می باشد که گنجاندن همه آنها در این آموزش میسر نمی باشد و من مباحث اصلی را ذکر کردم و برای اطلاعات بیشتر به اینجا مراجعه کنید



(با تشکر از حامد آریان)
قوانین انجمن لاراولیستا  | شماره تماس :‌09124783045 |‌ تلگرام :‌ 09377869283
پاسخ
#2
سلام از وقتی که برای آموزش ها میگذارین سپاس گذارم ، من تازه به این فریم ورک پیوستم اما برای شروع پکیج های آموزشی لاراکست رو گرفتم تو بعضی از آموزش ها دیدم که تو migration برای عمل ریلیشن فیلدها را unsigned میکنه
کد پی‌اچ‌پی:
$table->integer('cate_if')->unsigned(); 

و
کد پی‌اچ‌پی:
$table->foreign('cate_id')
 
               ->reference('id')
 
               ->on('article_categories'); 

میشه بپرسم دلیلش چیه ؟ من اسکیما تیبل هامو در اوردم ! اما برای migrate خطا کوئری اکسپکشن میده !
پاسخ
#3
دقت کنید که حتما جدول مرجع در ابتدا و سپس جدول دارای کلید خارجی migrate  شود.
پاسخ
#4
رعایت میکنم ! خطا‌:
کد:
[Illuminate\Database\QueryException]
  SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 (SQL: alter table `articles` add constraint articles_user_id_foreign foreign key (`user_id`
  ) references `users` ())
پاسخ
#5
(06-29-2015, 10:56 PM)allahyar نوشته:  رعایت میکنم ! خطا‌:

کد:
 [Illuminate\Database\QueryException]
 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 (SQL: alter table `articles` add constraint articles_user_id_foreign foreign key (`user_id`
 ) references `users` ())


لطفا Schema جدول را قرار بدید.
پاسخ
#6
(06-29-2015, 07:56 AM)اوات نوشته:  دقت کنید که حتما جدول مرجع در ابتدا و سپس جدول دارای کلید خارجی migrate  شود.

(06-30-2015, 04:08 AM)اوات نوشته:  
(06-29-2015, 10:56 PM)allahyar نوشته:  رعایت میکنم ! خطا‌:


کد:
 [Illuminate\Database\QueryException]
 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 1 (SQL: alter table `articles` add constraint articles_user_id_foreign foreign key (`user_id`
 ) references `users` ())


لطفا Schema جدول را قرار بدید.

کد پی‌اچ‌پی:
Schema::create('users', function(Blueprint $table)
        {
            
$table->increments('id');
            
$table->string('name');
            
$table->string('email')->unique();
            
$table->string('password'60);
            
$table->rememberToken();
            
$table->timestamps();
        }); 

کد پی‌اچ‌پی:
Schema::create('articles', function(Blueprint $table)
        {
            
$table->increments('id');
            
$table->string('title');
            
$table->string('slug');
            
$table->integer('user_id')->unsigned();
            
$table->text('story');
            
$table->text('fullstory');
            
$table->integer('seen');
            
$table->timestamps();
            
$table->timestamp('published_at');

            
$table->foreign('user_id')
                ->
reference('id')
                ->
on('users');
        }); 

ممنون
پاسخ
#7
     دوست عزیز در جدول articles کلمه reference را به references تغییر دهید.
کد پی‌اچ‌پی:
           $table->integer('user_id')->unsigned();
 
           $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); 
پاسخ
#8
آخ آخ ، آقا خیلی ممنون

آقا باز هم معذرت :

کد پی‌اچ‌پی:
        Schema::create('languages', function(Blueprint $table)
        {
            
$table->increments('id');
            
$table->string('title');
            
$table->integer('direction');
            
$table->timestamps();
        }); 

کد پی‌اچ‌پی:
Schema::create('article_categories', function(Blueprint $table)
        {
            
$table->increments('id');
            
$table->string('title');
            
$table->string('slug');
            
$table->integer('lang_id');
            
$table->text('comment');
            
$table->timestamps();

            
$table->foreign('lang_id')
                ->
references('id')
                ->
on('languages');
        }); 


کد:
[Illuminate\Database\QueryException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `article_categories` add constraint article_categories_lang_id_foreign foreign key (`lang_id`) references `languages` (`id`))



[PDOException]
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
پاسخ
#9
این بار امتحان کنید
کد پی‌اچ‌پی:
$table->integer('lang_id')->unsigned();
            
$table->foreign('lang_id')->references('id')->on('languages')->onDelete('cascade'); 
پاسخ
#10
سلام
در مورد این آموزش شما سوال داشتم.
برای اینکه این تاپیک آموزشی خراب نشه در تاپیک دیگه عنوان شد:

درخواست راهنمايي براي طراحی جداول دیتابیس

ممنون میشوم راهنمایی بفرمایید
پاسخ
 


موضوعات مشابه ...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  آموزش اعتبار سنجی در لاراول 5 alihossein 4 773 11-20-2016, 07:12 AM
آخرین ارسال: حمید رﺽا کمالی
  آموزش روتینگ routing در لاراول 5 alihossein 2 1,129 11-12-2016, 04:37 AM
آخرین ارسال: حمید رﺽا کمالی
  آموزش کار با دیتابیس در لاراول 5 alihossein 6 1,555 10-27-2016, 01:01 PM
آخرین ارسال: sempaisaleh
  ارتباط بین جداول many to many زهرا 8 164 10-10-2016, 05:07 AM
آخرین ارسال: زهرا
  آموزش 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
  Relationships؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟؟ maryam 1 90 04-22-2016, 06:36 AM
آخرین ارسال: hamo
  درخواست آموزش کار با پکیج 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

پرش به انجمن:


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

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

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