2016-03-27 6 views
0

Объект Page имеет любое количество Widgets, и каждая пара Page-Widget имеет специальные опции (например, положение, пользовательское название).Laravel: принадлежитToMany с дополнительными полями

Я только что сделал

class Page extends Model { 
    public function widgets(){ 
     return $this->belongsToMany('App\Widget'); 
    } 
} 
... 
class Widget extends Model { 
} 

Я добавил несколько столбцов в таблице page_widget (положение, настройки ...).

Как я могу получить/обновить их через $page->widget->position? Мне также нужна возможность получить виджеты страниц, отсортированные по этому значению position.

Просьба предложить типовые отношения. Благодарю.

+0

Предполагая, что у вас есть отношения «многие-ко-многим», у вас есть сводная таблица под названием 'pages_widget'. Вы можете добавить столбцы в эту таблицу и получить доступ к значениям с помощью 'pivot'. Взгляните на заключительную часть от многих до многих отношений (а именно на получение промежуточных столбцов таблицы), на [docs] (https://laravel.com/docs/5.1/eloquent-relationships) –

+0

Просто добавьте комментарий @milz. A_pivot table_ - это просто таблица _join_, которая содержит дополнительные столбцы (например, вашу «позицию»). – Michael

ответ

1

Вы можете добавить дополнительные поля, как это:

class Page extends Model { 
    public function widgets(){ 
     return $this->belongsToMany('App\Widget')->withPivot('position', 'settings); 
    } 
} 

Затем, чтобы создать эту строку в БД, вы делаете:

$page->widgets()->attach($widgetId, ['position' => $position, 'settings' => $settings]); 

Чтобы получить доступ к данным в сводной таблице вы можете сделать:

foreach ($page->widgets as $widget) { 
    echo $widget->pivot->position; 
    echo $widget->pivot->settings; 
} 

В официальной документации имеется много информации: https://laravel.com/docs/5.2/eloquent-relationships#many-to-many

Смежные вопросы