سلام دوستان یه سوال داشتم من میخام مقالاتم یه سری تگ داشته باشند و دوره هام هم یه سری تگ به صورتی که مثلا روی تگ های مقاله کلیک شد بره مقالات مربوط به اون تگ رو بیاره و دوره هارو نیاره برام و یا اینکه بالعکس روی یک تگ از دوره ها کلیک شد بره دوره های مربوط به اون تگ رو بیاره و با مقالات کاری نداشته باشه برای اینکار از روش زیر استفاده کردم درسته؟
public function up()
{
Schema::create('tags', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->timestamps();
});
Schema::create('article_tag', function (Blueprint $table) {
$table->unsignedBigInteger('article_id');
$table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
$table->unsignedBigInteger('tag_id');
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
$table->unique(['article_id' , 'tag_id']);
});
Schema::create('course_tag', function (Blueprint $table) {
$table->unsignedBigInteger('course_id');
$table->foreign('course_id')->references('id')->on('courses')->onDelete('cascade');
$table->unsignedBigInteger('tag_id');
$table->foreign('tag_id')->references('id')->on('tags')->onDelete('cascade');
$table->unique(['course_id' , 'tag_id']);
});
}
به نظرم روش بهتر استفاده از رابطه Polymorphic Many to Mnay باشه. اتفاقا مثالی که که در مستندات خود لاراول هم برای این بحث زده شده پیاده سازی تگ برای post و vidoe هست.
ساختار دیتابیستون این شکلی باید باشه:
articles
id - integer
name - string
courses
id - integer
name - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
توابع ایجاد Relation در مدل ها رو هم بهتره از روی مستندات خودتون ملاحظه کنید:
https://laravel.com/docs/7.x/eloquent-relationships#many-to-many-polymorphic-relations
@mhyeganeh
اما من تو لاراکست دیدم many to many رو برای پیاده سازی تگ ها استفاده کرد؟ فک کنم این رابطه ای که شما فرستادین این مدلیه که مثلا هر پست چندین تگ داشته باشه و هر ویدیو هم چندین تگ داشته باشه درصورتی که مثلا من کورس هام و ویدیوهام از هم جدا نیستن و جدولشون یکی مثلا هر کورس n تا ویدیو داره و هر ویدیو متعلق به یه کورس هستش ولی این مستندات لاراول مثال رو برای وقتی زده که پست ها جدا و ویدیو ها جدا تگ های خودشونو داشته باشن و برای اینکار از جدول رابط استفاده کرده که ارتباط بین تگ ها و پست ها و ویدیو هارو برقرار کنه
@mehrdadroshanraee69
پست و ویدیو رو فراموش کنید. این مربوط به مثالی هست که تو مستندات استفاده کرده. تو مثال شما طبق چیزی که در صورت سوالتون نوشتید میخواید برای article و course هاتون از تگ استفاده کنید و دقیقا شرایطش مثل همون پست و ویدیو هست.
از رابطه many to many زمانی استفاده میشه که فقط بخواید بین article و tag یا فقط بین course و tag ارتباط برقرار کنید. وقتی هر دو این ها میخوان از تگ ها استفاده کنند و رابطه هر دوشون هم many to many هست بهترین گزینه همون Polymorphic Many to Mnay خواهد بود.
احساس میکنم خیلی با مفهوم روابط Polymorphic آشنا نیستید. اگر یکبار همون مستندات بخش polymorphic رو با مثال هایی که زده اگر بخونید خیلی شفاف توضیح داده و کمک کننده است.
@mhyeganeh
چرا مستندات رو مطالعه میکنم همیشه ولی خوب برام سوال بود وبسایتی مثل راکت هم مثل همین سوالی که من داشتم تگ هارو پیاده کرده مثلا یک تگ رو دوره میزنی فقط دوره های مرتبط با تگ رو میاره و کار به مقالات نداره
@mehrdadroshanraee69
خوب دیگه. کاربرد رابطه Polymorphic Many to Mnay دقیقا همینه و خیلی راحت میتونید تگ های مربوط به یک مقاله و یا برعکس مقالات مربوط به یک تگ رو بگیرید. از اون طرف هم میتونید تگ های مربوط به کورس رو بگیرید و یا کورس های مرتبط با یک تگ رو بگیرید.
بعد از اینکه relation هاتون رو به درستی در مدل ایجاد کردید کافیه بگید:
$article = Article::find(1);
foreach ($article->tags as $tag) {
//
}
اینجوری تمام تگ های فقط مرتبط با اون مقاله رو میده و یا از اون طرف:
$tag = Tag::find(1);
foreach ($tag->articles as $article) {
//
}
اینجوری هم فقط مقالاتی که اون تگ بهشون تخصیص داده شده رو میده.
عین همین کارو میتونید برای course هم انجام بدید وبدون اینکه با هم قاطی بشن، هر سری فقط نتایج مربوط به مدل مربوطه رو میده.
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟