View Full Version : pivot table
lady64
پنج شنبه 03 بهمن 1398, 07:20 صبح
سلام.
آیا مفهوم pivot table همان join شدن هست ؟
دو جدول notes و tags رابطه چند به چند دارند . در مدل note داریم :
public function tags(){
// return $this->belongsToMany(Tag::class )->withTimestamps()->withPivot('created_at');
return $this->belongsToMany(Tag::class )->withPivot('created_at');
}
وقتی اینو مینویسیم :
$note=App\Note->find(4);$note->tags()->get();
خروجی رو درست میده .
اما چرا باید فقط یک note رو پیدا کنیم و بعد تمام تگ هاشو.
میخوام تمام note هایی که tag دارند رو نمایش بده . یا note های 3 و 4 . ولی جواب نمیده.
$note=App\Note->find([3,4]);$note->tags()->get();
و در این حالت این خطا رو میده
BadMethodCallException with message 'Method Illuminate/Database/Eloquent/Collection::tags does not exist.'
plague
پنج شنبه 03 بهمن 1398, 16:42 عصر
1 - pivot برای تیبل هایی هست که رابطه چند به چند دارن
وقتی تیبل ها رابطه یک به یک یا یک به چند دارن میتونی 2 تا تیبل رو مستقیم به هم وصل با کلید خارجی کنی
ولی وقتی چند به چند هستن از pivot استفاده میکنی
مثلا تیبل پرد و فرزند داریم اگه رابطه یک به چند باشه یعنی یک پدر چند فرزند داشته باشه
ساختارشو ناینجوری میشه که
تیبل پدر : شناسه , نام
تیبل فرزند : شناسه , شناسه پدر , نام
ولی اگه چند به چند باشن نمیتونی شناسه پدر رو تو تیبل فرزند بزاری و وصلشون کن چون یک فرزند ممکنه برای چندین پدر باشه و بیش از یک شناسه پدر داره
اینجوری نیاز داری کی تیبل سومی باشه که ساختارش اینجوری میشه
تیبل پدر : شناسه , نام
تیبل فرزند : شناسه , نام
تیبل پدر_فرزند : شناسه پدر , شناسه فرزند
2 - وقتی یک ردیف رو میخونی یه آبجکت برمیگردونه
و آبجکت میتونه توابع کلاس رو صدا بزنه (اگه متوجه نمیشی این رو به مفاهیم برنامه نویسی شی گرا برمیگرده )
ولی وقتی چند تا ردیف رو بخونی یه آرایه برمیگردونه و آرایه نمیتونه تابع کلاس رو صدا بزنه
میتونی همچین چیزی بنویسی
$notes=App\Note:has('tags')->find([3,4]);
foreach($notes as $note )
{
$tags = $note->tags;
}
بهتره که اسم مدل ها و توابع رلیشن توی مدل با حروف بزرگ شروع بشه که با نام خونه های دیتابیس فرق کنن
lady64
جمعه 04 بهمن 1398, 18:58 عصر
قبلا ها دکمه ی تشکر بود .
تشکر از شما . فکر میکنم دارم متوجه میشم .
lady64
شنبه 05 بهمن 1398, 08:43 صبح
من میخواستم همزمان هم نوت ها را بدهد و هم تگ های مربوط به هر نوت . با این کد درست میشه :
$notes = Note::find([3,4]);
foreach($notes as $note )
{
echo $note->id.'<br/>';
$tags= $note->tags;
foreach($tags as $tag){
echo $tag->name.'<br/>';
}
echo '<hr/>';
}
ولی بیشتر مدنظرم این بود که با این یک خط کد نتیجه رو بگیرم .
$notes = Note::with('tags')->find([3,4]);
چون وقتی در کد بالا $notes را return میکنیم در خروجی json هم نوت ها را میبینم و هم تگ های هر نوت را.
plague
شنبه 05 بهمن 1398, 14:05 عصر
وقتی با with بخونی توی نتیجه tags ها هم هستن یعنی اونها رو هم از دیتابیس میخونه .... ولی بازم باید با foreach چاپشون کنی
چون توی ساختار برگشتی tag ها زیر مجموعه هر note هستن در نتیجه باید اول بری توی هر نوت بعد تگش رو بگیری
به عبارت دیگه با یک خط همه نوت ها وتگ ها رو داری میخونی ولی برای نمایششون باید اینجوری اقدام کنی
اگه بخای همه تگ ها رو یکجا داشته باشی میتونی مستقیم از تیبل تگ ها بخونی
$tags = Tag::whereHas('Note' , function($q){
$q->whereIn('id' , [3,4]);
})->get();
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.