برنامه نویسی

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

مقدمه

در مقطعی از حرفه هر توسعه دهنده ، تعامل با یک پایگاه داده به یک کار اساسی تبدیل می شود. این جایی است که فصاحت ، نقشه بردار قدرتمند شیء لاراول (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 می تواند گردش کار شما را به میزان قابل توجهی بهبود بخشد و کد شما را کارآمدتر و خواندن آسان تر کند.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا