کاوش در عمق لارولا

مقدمه
در مقطعی از حرفه هر توسعه دهنده ، تعامل با یک پایگاه داده به یک کار اساسی تبدیل می شود. این جایی است که فصاحت ، نقشه بردار قدرتمند شیء لاراول (ORM) ، بازی می شود. در مقاله قبلی خود در مورد مدل ها ، من به طور خلاصه در مورد فصیح بحث کردم ، اما این مقاله کاملاً به کاوش در عمق آن اختصاص یافته است. فصیح با ارائه روشی بصری و طبیعی برای تعامل با داده های خود ، روند کار با جداول پایگاه داده را ساده می کند. این امکان را به توسعه دهندگان می دهد تا سوابق پایگاه داده را به گونه ای مدیریت کنند که گویی با اشیاء منظم PHP کار می کنند و عملیات پایگاه داده را کارآمدتر و مستعد خطا می کند.
برای توسعه دهندگان با استفاده از لاراول ، مهم است که شش نوع مهم رابطه را در فصیح بدانید. این روابط تعیین می کند که چگونه جداول مختلف پایگاه داده ارتباط دارد و چگونه می توان به داده ها و چگونه می توان به آنها دستکاری و دستکاری کرد. دانستن این روابط نه تنها باعث می شود شما در طراحی طرحواره های پایگاه داده جامد بهتر شود بلکه باعث می شود برنامه شما بتواند با سهولت مدیریت تعامل داده های پیچیده را داشته باشد. در بخش های آینده ، ما در مورد این شش نوع رابطه مهم به طور عمیق بحث و بررسی خواهیم کرد و اطلاعات لازم را برای استفاده از فصاحت به نفع خود در برنامه های خود به شما می دهد.
روابط در فصیح چیست؟
برای شروع ، بیایید در مورد روابط در فصیح صحبت کنیم. روابط دقیقاً در فصیح چیست؟ همانطور که نام آن پیداست ، یک رابطه نحوه اتصال اشخاص مختلف را مشخص می کند.
به عنوان مثال ، یک مادر و دخترش را در نظر بگیرید. یک مادر فرزند دارد و آن کودک به طور مستقیم با مادرش در ارتباط است. این ارتباط یک رابطه است – تعریف می کند که چگونه یک نهاد (مادر) با دیگری (دختر) در ارتباط است. به طور مشابه ، در یک پایگاه داده ، روابط چگونه جداول مختلف و نحوه تعامل آنها با یکدیگر تعریف می کنند. درست همانطور که یک مادر می تواند چندین فرزند داشته باشد ، یک جدول پایگاه داده می تواند چندین سوابق مرتبط را در جدول دیگری داشته باشد. یا درست همانطور که کودک متعلق به یک مادر خاص است ، یک رکورد در یک جدول ممکن است متعلق به یک رکورد واحد در دیگری باشد.
در فصیح ، روابط به شما امکان می دهد ارتباطات معنی داری بین مدلها برقرار کنید ، که نمایانگر جداول پایگاه داده است. این روابط ، بازیابی داده های مرتبط را بدون نوشتن پرس و جوهای پیچیده به صورت دستی آسان می کند. به جای برخورد با RAW SQL به پیوستن ، فصیح یک نحو ساده و شهودی برای تعریف و مدیریت روابط فراهم می کند. این ویژگی قدرتمند به توسعه دهندگان کمک می کند تا ضمن تمیز نگه داشتن کد و خواندنی ، با داده های ساختاری به طور کارآمد سازماندهی ، مدیریت و تعامل داشته باشند.
به عنوان مثال ، در یک برنامه وبلاگ نویسی ، ممکن است یک مدل کاربر و یک مدل پست داشته باشید. کاربر می تواند پست های زیادی داشته باشد و هر پست متعلق به یک کاربر خاص است. با تعریف روابط در فصیح ، می توانید به راحتی تمام پست های نوشته شده توسط یک کاربر را بازیابی کنید یا نویسنده یک پست خاص را بدون نوشتن نمایش داده های پیچیده SQL پیدا کنید. با این وجود ، در این مقاله من بیشترین روابط را در فصیح و نحوه کار آنها توضیح می دهم.
1. رابطه یک به یک
یک رابطه یک به یک ساده ترین نوع رابطه در طراحی پایگاه داده است ، که در آن یک رکورد واحد در یک جدول به طور مستقیم با یک رکورد در جدول دیگر همراه است. این نوع رابطه اغلب برای ذخیره اطلاعات اضافی یا تکمیلی در یک جدول جداگانه ضمن حفظ ارتباط واضح بین سوابق مرتبط استفاده می شود.
به عنوان مثال ، در یک برنامه وبلاگ نویسی ، a User
ممکن است یکی داشته باشد Profile
، و هرکدام Profile
متعلق به یک تک است User
بشر در users
جدول شامل اطلاعات اساسی مانند id
با name
وت email
، در حالی که profiles
جدول جزئیات دیگری مانند id
با user_id
با bio
وت avatar
بشر در user_id
در profiles
جدول به عنوان یک کلید خارجی عمل می کند ، با مراجعه به این صفحه ، هر نمایه را به یک کاربر خاص پیوند می دهد id
در users
جدول این تنظیم تضمین می کند که هر کاربر فقط یک پروفایل داشته باشد و هر نمایه متعلق به یک کاربر واحد است و باعث می شود در صورت لزوم جزئیات کاربر اضافی را بازیابی کنید.
با استفاده از رابطه مادر و دختر که قبلاً از آنها استفاده کردم رابطه یک به یک آیا رابطه بین a است مادر و دخترشبشر هر مادر تنها یک دختر بیولوژیکی (در این سناریو) دارد و هر دختر فقط یک مادر بیولوژیکی دارد. در یک پایگاه داده ، این رابطه با داشتن یک جدول مرجع دیگری از طریق یک کلید خارجی نشان داده شده است. به عنوان مثال ، الف mothers
جدول و الف daughters
جدول را می توان به گونه ای ساخت که daughters
جدول شامل a mother_id
، که هر دختر را دقیقاً به یک مادر پیوند می دهد.
توضیح کد و خروجی
در فصیح ، شما یک رابطه یک به یک را با استفاده از hasOne
روش در User
مدل و belongsTo
روش در Profile
مدل. این بدان معنی است که یک کاربر می تواند یک پروفایل داشته باشد و هر نمایه متعلق به یک کاربر واحد است. اساساً ، hasOne
روش تعیین می کند که یک کاربر فقط یک پروفایل دارد ، در حالی که belongsTo
روش نشان می دهد که هر نمایه به یک کاربر خاص مرتبط است. این تنظیم یک ارتباط مستقیم و منحصر به فرد بین کاربر و نمایه آنها را تضمین می کند.
// User Model
class User extends Model {
public function profile() {
return $this->hasOne(Profile::class);
}
}
// Profile Model
class Profile extends Model {
public function user() {
return $this->belongsTo(User::class);
}
}
برای بازیابی نمایه کاربر ، می توانید از کد زیر استفاده کنید:
$user = User::find(1);
$profile = $user->profile;
خروجی
اگر کاربر با شناسه 1 دارای پروفایل باشد ، $profile
شامل جزئیات پروفایل ، مانند bio
وت avatar
بشر اگر مشخصات وجود نداشته باشد ، $profile
خواهد شد null
بشر
2. رابطه یک به یک
یک رابطه یک به یک یکی از متداول ترین انواع روابط است که در آن یک رکورد واحد در یک جدول با سوابق متعدد در جدول دیگر همراه است. برای اینکه این موضوع را بهتر درک کنید ، به یک مادر و فرزندانش فکر کنید. یک مادر می تواند چندین فرزند داشته باشد ، اما هر کودک فقط یک مادر بیولوژیکی دارد. یک مادر ، بسیاری از کودکان. رابطه یک به یک به طور معمول با داشتن یک جدول مرجع دیگری با استفاده از یک کلید خارجی نشان داده می شود. به عنوان مثال ، بیایید بگوییم که ما یک میز مادران و یک میز کودکان داریم. جدول کودکان حاوی ستونی به نام mother_id است که هر کودک را به یک مادر خاص پیوند می دهد. به عنوان مثال با استفاده از یک سناریوی برنامه واقعی ، در یک بستر وبلاگ نویسی ، a User
می تواند بسیاری ایجاد کند Post
سوابق ، اما هر یک Post
متعلق به تنها یک User
بشر در users
جدول ممکن است شامل ستون هایی مانند باشد id
با name
وت email
، در حالی که posts
جدول شامل ستون هایی مانند id
با user_id
با title
وت content
بشر در user_id
در posts
جدول به عنوان یک کلید خارجی عمل می کند و هر پست را به کاربر که آن را ایجاد کرده است پیوند می دهد. این به شما امکان می دهد تا تمام پست های نوشته شده توسط یک کاربر خاص را به طور موثر بازیابی کنید و از یک ارتباط واضح و قابل کنترل بین کاربران و پست های آنها اطمینان حاصل کنید.
توضیح کد و خروجی
در فصیح ، شما با استفاده از hasMany
روش در User
مدل و belongsTo
روش در Post
مدل. این بدان معنی است که یک کاربر می تواند پست های زیادی داشته باشد و هر پست متعلق به یک کاربر واحد است. اساساً ، hasMany
روش تعیین می کند که کاربر می تواند چندین پست ایجاد کند ، در حالی که belongsTo
روش نشان می دهد که هر پست با یک کاربر همراه است. شما گریت؟
// User Model
class User extends Model {
public function posts() {
return $this->hasMany(Post::class);
}
}
// Post Model
class Post extends Model {
public function user() {
return $this->belongsTo(User::class);
}
}
برای بازیابی همه پست های توسط یک کاربر ، می توانید از کد زیر استفاده کنید:
$user = User::find(1);
$posts = $user->posts;
خروجی
اگر کاربر با شناسه 1 پست هایی ایجاد کرده است ، $posts
مجموعه ای از تمام پست های مرتبط با آن کاربر خواهد بود. اگر هیچ پستی وجود نداشته باشد ، این مجموعه خالی خواهد بود.
3. رابطه بسیاری به یک
یک رابطه چند به یک در اصل معکوس یک رابطه یک به یک است ، جایی که سوابق متعدد در یک جدول با یک رکورد واحد در جدول دیگر همراه است. این رابطه زمانی مورد استفاده قرار می گیرد که بسیاری از نهادها به یک نهاد واحد در ارتباط هستند یا مرتبط هستند. به عنوان مثال ، هنوز هم با استفاده از سناریو مادر ما به کودکان ، دوباره به یک مادر و فرزندانش فکر کنید ، اما این بار از دید کودک. هر کودک فقط یک مادر بیولوژیکی دارد ، اما یک مادر می تواند چندین فرزند داشته باشد. بنابراین ، از دیدگاه کودک ، این یک رابطه بسیار به یک است-بسیاری از کودکان متعلق به یک مادر هستند. این به همان روشی که یک به یک است نشان داده شده است ، اما اکنون ما روی طرف “بسیاری” (کودکان) تمرکز می کنیم. هر کودک باید یک مادر داشته باشد ، بنابراین جدول کودکان یک مادر را برای پیوند هر کودک به یک مادر خاص ذخیره می کند.
در یک برنامه کلمه واقعی ، به عنوان مثال ، در یک بستر وبلاگ نویسی ، بسیاری Post
سوابق می توانند متعلق به یک واحد باشند User
بشر در users
جدول ممکن است شامل ستون هایی مانند باشد id
با name
وت email
، در حالی که posts
جدول شامل ستون هایی مانند id
با user_id
با title
وت content
بشر در user_id
در posts
جدول به عنوان یک کلید خارجی عمل می کند و هر پست را به نویسنده خود پیوند می دهد. این تنظیم به شما امکان می دهد تا به راحتی نویسنده یک پست را با پرس و جو تعیین کنید users
جدول با استفاده از user_id
از posts
جدول ، اطمینان از رابطه واضح و کارآمد بین پست ها و نویسندگان آنها.
توضیح کد و خروجی
کد مربوط به یک رابطه بسیاری به یک در اصل همان است که برای یک رابطه یک به بیش از حد ، اما چشم انداز تغییر می کند. به جای تمرکز روی طرف “یک” (مانند کاربر که دارای پست های زیادی است) ، شما روی سمت “بسیاری” تمرکز می کنید (مانند پست های متعلق به کاربر). برای تعریف این رابطه ، شما از belongsTo
روش در Post
مدل. این بدان معنی است که هر پست متعلق به یک کاربر واحد است و پیوند روشنی بین پست و نویسنده آن برقرار می کند. بنابراین ، در حالی که رابطه یک به یک در User
مدل استفاده hasMany
، رابطه بسیار به یک در Post
مدل استفاده belongsTo
بشر
// Post Model
class Post extends Model {
public function user() {
return $this->belongsTo(User::class);
}
}
برای بازیابی نویسنده یک پست ، می توانید از کد زیر استفاده کنید:
$post = Post::find(1);
$user = $post->user;
خروجی
اگر پست با شناسه 1 دارای یک کاربر مرتبط باشد ، $user
شامل جزئیات کاربر ، مانند name
وت email
بشر اگر هیچ کاربر در ارتباط نیست ، $user
خواهد شد null
بشر
4. بسیاری از رابطه های
یک رابطه بسیار به بسیاری از افراد هنگامی رخ می دهد که سوابق متعدد در یک جدول با سوابق متعدد در جدول دیگر همراه باشد. این نوع رابطه زمانی استفاده می شود که نهادهای هر دو جدول می توانند چندین ارتباط با یکدیگر داشته باشند. این امر برای مدیریت رابطه به یک جدول میانی (محوری) نیاز دارد.
با ترک سناریوی مادر و فرزندان ما ، اجازه می دهیم نمونه ای واقع بینانه تر را تطبیق دهیم ، به دانش آموزان و کلاس ها در یک مدرسه فکر کنیم.
- یک دانش آموز مجرد می تواند در کلاس های مختلف (ریاضی ، علوم ، انگلیسی و غیره) ثبت نام کند.
- یک کلاس واحد می تواند بسیاری از دانشجویان را ثبت نام کند.
- این بدان معناست که دانش آموزان کلاس های زیادی دارند و کلاس ها دانش آموزان زیادی دارند-این یک رابطه بسیار به بسیاری است.
این نوع رابطه فقط با دو جدول قابل مدیریت نیست. در عوض ، یک جدول سوم ، به نام جدول محوری ، برای اتصال آنها لازم است.
برای نشان دادن این ، ما به سه جدول نیاز داریم:
- دانش آموزان – جزئیات دانشجویی مانند شناسه ، نام و ایمیل را ذخیره می کنند.
- کلاس ها – جزئیات کلاس مانند شناسه ، موضوع_ نام و Teacher_ID را ذخیره می کند.
- student_class (جدول محوری) – دانش آموزان و کلاس ها را با دانش آموز_ID و class_id متصل می کند.
این جدول محوری تضمین می کند که هر دانش آموز می تواند در حالی که به هر کلاس اجازه می دهد چندین دانش آموز داشته باشد ، در کلاس های مختلف ثبت نام کند. نمایندگی این در یک بستر وبلاگ نویسی ، a Post
می تواند بسیاری داشته باشد Tag
سوابق ، و الف Tag
می تواند با بسیاری همراه باشد Post
سوابق. برای اجرای این کار ، به سه جدول نیاز دارید: posts
جدول ، tags
جدول ، و یک جدول محوری مانند post_tag
بشر در posts
جدول ممکن است شامل ستون هایی مانند باشد id
با title
وت content
، در حالی که tags
جدول شامل ستون هایی مانند id
وت name
بشر جدول محوری ، post_tag
، شامل ستون هایی مانند post_id
وت tag_id
، که به عنوان کلیدهای خارجی که پست ها را به برچسب ها پیوند می دهند ، عمل می کنند. این تنظیم به شما امکان می دهد تا به راحتی تمام برچسب های مرتبط با یک پست یا تمام پست های مرتبط با یک برچسب خاص را بازیابی کنید و از یک رابطه انعطاف پذیر و مقیاس پذیر بین پست ها و برچسب ها اطمینان حاصل کنید.
توضیح کد و خروجی
در فصاحت ، شما یک رابطه بسیار با استفاده از آن را با استفاده از belongsToMany
روش در هر دو Post
وت Tag
مدل ها.
// Post Model
class Post extends Model {
public function tags() {
return $this->belongsToMany(Tag::class);
}
}
// Tag Model
class Tag extends Model {
public function posts() {
return $this->belongsToMany(Post::class);
}
}
برای بازیابی همه برچسب ها برای یک پست ، می توانید از کد زیر استفاده کنید:
$post = Post::find(1);
$tags = $post->tags;
خروجی
اگر پست با شناسه 1 دارای برچسب های مرتبط باشد ، $tags
مجموعه ای از تمام برچسب های مرتبط با آن پست خواهد بود. اگر هیچ برچسب وجود نداشته باشد ، این مجموعه خالی خواهد بود
5. یک رابطه از طریق
یک رابطه یکپارچه نوعی رابطه است که یک مدل از طریق یک مدل میانی به یک مدل دیگر متصل می شود. این رابطه هنگامی مفید است که شما نیاز به دسترسی به داده ها از یک جدول مرتبط که مستقیماً به جدول اصلی وصل نشده است ، مفید است.
به عنوان مثال مادر و فرزندان ما ، یک مادربزرگ ، یک مادر و یک فرزند را تصور کنید: مادربزرگ مستقیماً با نوه رابطه ندارد ، اما او از طریق مادر در ارتباط است.
اگر می خواهیم مادربزرگ یک نوه پیدا کنیم ، باید از طریق مادر عبور کنیم.
در یک سناریوی دیگر ، الف Supplier
ممکن است یکی داشته باشد History
ضبط از طریق a User
بشر در suppliers
جدول ممکن است شامل ستون هایی مانند باشد id
وت name
، users
جدول ممکن است دارای ستون هایی باشد id
با supplier_id
وت name
، و histories
جدول ممکن است شامل ستون هایی مانند باشد id
با user_id
وت details
بشر در supplier_id
در users
جدول تأمین کنندگان را به کاربران پیوند می دهد و user_id
در histories
جدول کاربران را به تاریخچه خود پیوند می دهد. این تنظیم به شما امکان می دهد با عبور از کاربر مرتبط با آن تأمین کننده ، تاریخ یک تأمین کننده را بازیابی کنید و از یک رابطه واضح و کارآمد بین تأمین کنندگان و تاریخچه آنها اطمینان حاصل کنید.
توضیح کد و خروجی
در فصیح ، شما یک رابطه با یک و یک از طریق را با استفاده از hasOneThrough
روش در Supplier
مدل.
// Supplier Model
class Supplier extends Model {
public function history() {
return $this->hasOneThrough(History::class, User::class);
}
}
برای بازیابی تاریخ تهیه کننده ، می توانید از کد زیر استفاده کنید:
$supplier = Supplier::find(1);
$history = $supplier->history;
خروجی
اگر تأمین کننده با شناسه 1 از طریق کاربر سابقه مرتبط داشته باشد ، $history
شامل جزئیات تاریخ خواهد بود. اگر تاریخ وجود نداشته باشد ، $history
خواهد شد null
بشر
6. رابطه چندگانه از طریق
یک رابطه از هر طریق از طریق نوعی رابطه است که در آن یک مدل از طریق یک مدل میانی به چندین رکورد در مدل دیگر متصل می شود. این رابطه هنگامی مفید است که شما نیاز به دسترسی به چندین سوابق مرتبط که مستقیماً به جدول اصلی وصل نشده اند ، دسترسی پیدا کنید. در کلمات کلیدی ، یک رابطه با یکپارچه شبیه به یک-یک-از طریق است ، اما به جای بازیابی یک رکورد مرتبط ، ما چندین سوابق مرتبط را از طریق یک مدل دیگر بازیابی کنید.
به عنوان مثال ، الف Country
ممکن است بسیاری داشته باشد Post
سوابق از طریق آن User
سوابق. در countries
جدول ممکن است شامل ستون هایی مانند باشد id
وت name
، users
جدول ممکن است دارای ستون هایی باشد id
با country_id
وت name
، و posts
جدول ممکن است شامل ستون هایی مانند باشد id
با user_id
با title
وت content
بشر در country_id
در users
جدول کشورها را به کاربران پیوند می دهد و user_id
در posts
جدول کاربران را به پست های خود پیوند می دهد. این تنظیم به شما امکان می دهد تمام پست های ساخته شده توسط کاربران از یک کشور خاص را بازیابی کنید و از یک رابطه واضح و کارآمد بین کشورها و پست های آنها اطمینان حاصل کنید.
توضیح کد و خروجی
در فصیح ، شما با استفاده از این رابطه را از طریق بسیاری تعریف می کنید hasManyThrough
روش در Country
مدل.
// Country Model
class Country extends Model {
public function posts() {
return $this->hasManyThrough(Post::class, User::class);
}
}
برای بازیابی همه پست های کاربران در یک کشور ، می توانید از کد زیر استفاده کنید:
$country = Country::find(1);
$posts = $country->posts;
خروجی
اگر کشور با شناسه 1 کاربرانی دارد که پست ها را ایجاد کرده اند ، $posts
مجموعه ای از تمام پست های مرتبط با کاربران آن کشور خواهد بود. اگر هیچ پستی وجود نداشته باشد ، این مجموعه خالی خواهد بود.
در نتیجه ، روابط فصیح یک ویژگی قدرتمند لاراول است که رسیدگی به داده های مرتبط را ساده می کند. چه با روابط یک به یک یا بسیاری از افراد کار کنید ، فصیح یک نحو بصری و سر راست را برای تعریف و پرس و جو در انجمن ها ارائه می دهد. تسلط بر این روابط به عنوان یک توسعه دهنده Laravel می تواند گردش کار شما را به میزان قابل توجهی بهبود بخشد و کد شما را کارآمدتر و خواندن آسان تر کند.