# زبان های اسکریپتی > PHP > Laravel Framework >  pivot table

## lady64

سلام.
آیا مفهوم 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

1 - pivot  برای تیبل هایی هست که رابطه چند به چند دارن 
وقتی تیبل ها رابطه یک به یک یا یک به چند دارن میتونی 2 تا تیبل رو مستقیم به هم وصل با کلید خارجی کنی 
ولی وقتی چند به چند هستن از pivot  استفاده میکنی 
مثلا تیبل پرد و فرزند داریم اگه رابطه یک به چند باشه یعنی یک پدر چند فرزند داشته باشه 
ساختارشو ناینجوری میشه که 

تیبل پدر : شناسه , نام
تیبل فرزند : شناسه , شناسه پدر , نام 

ولی اگه چند به چند باشن نمیتونی شناسه پدر رو تو تیبل فرزند بزاری و وصلشون کن چون یک فرزند ممکنه برای چندین پدر باشه و بیش از یک شناسه پدر داره 

اینجوری نیاز داری کی تیبل سومی باشه که ساختارش اینجوری میشه


تیبل پدر : شناسه , نام
تیبل فرزند : شناسه , نام 
تیبل پدر_فرزند :  شناسه پدر , شناسه فرزند 


2 - وقتی یک ردیف رو میخونی یه آبجکت برمیگردونه 
و آبجکت میتونه توابع کلاس رو صدا بزنه (اگه متوجه نمیشی این رو به مفاهیم برنامه نویسی شی گرا برمیگرده ) 
ولی وقتی چند تا ردیف رو بخونی یه آرایه برمیگردونه و آرایه نمیتونه تابع کلاس رو صدا بزنه 



میتونی همچین چیزی بنویسی


$notes=App\Note:has('tags')->find([3,4]);
foreach($notes as $note )
{
$tags = $note->tags;
}






بهتره که اسم مدل ها و توابع رلیشن توی مدل با حروف بزرگ شروع بشه که با نام خونه های دیتابیس فرق کنن

----------


## lady64

قبلا ها دکمه ی تشکر بود . 
تشکر از شما . فکر میکنم دارم متوجه میشم .

----------


## lady64

من میخواستم همزمان هم نوت ها را بدهد و هم تگ های مربوط به هر نوت . با این کد درست میشه :

$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

وقتی با with بخونی توی نتیجه tags ها هم هستن یعنی اونها رو هم از دیتابیس میخونه .... ولی بازم باید با foreach چاپشون کنی 
چون توی ساختار برگشتی tag ها زیر مجموعه هر note هستن در نتیجه باید اول بری توی هر نوت بعد تگش رو بگیری 

به عبارت دیگه با یک خط همه نوت ها وتگ ها رو داری میخونی ولی برای نمایششون باید اینجوری اقدام کنی 


اگه بخای همه تگ ها رو یکجا داشته باشی میتونی مستقیم از تیبل تگ ها بخونی 

$tags = Tag::whereHas('Note' , function($q){
    $q->whereIn('id' , [3,4]);
})->get();

----------

