@danildanil

Как реализовать многие-ко-многим в ActiveRecord?

Добрый день.
С вашего позволения 2 вопроса

1. В Active Record объектный экземпляр привязан к единственной строке в таблице. Как можно тогда объяснить такие методы, которые присутствуют почти в каждой реализации AR, ведь они не соответствуют записи в бд?

Джойны
$book = Book::all(array('joins' => array('author')));
sql => SELECT books.* FROM books INNER JOIN authors ON(books.author_id = authors.id)

Агрегатные функции
Book::find('all', array('select' => 'avg(price) as avg_price, avg(tax) as avg_tax'));
sql => SELECT avg(price) as avg_price, avg(tax) as avg_tax FROM books LIMIT 5,10

Группировка
Book::all(array('group' => 'price')); sql => SELECT * FROM books GROUP BY price

Группировка + having
Book::all(array('group' => 'price', 'having' => 'price > 45.00'));
sql => SELECT * FROM books GROUP BY price HAVING price > 45.00

Или же вообще нативный запрос в контроллере
$book = Book::find_by_sql('select title from books');

2. Как можно реализовать связь многие-ко-многим в самом простом случае? Например хочу получить у статьи все теги.
$article->tags;

Если связь один-ко-многим, то это понятно. Примерно это будет работать так:
$article->author;
Мы вызываем Author::findOne(['author_id' => $author_id]); // Где author_id значение в классе модели Article

Объясните пожалуйста. Заранее большое спасибо.
  • Вопрос задан
  • 206 просмотров
Решения вопроса 1
Decadal
@Decadal
А вы заметили, что описанные вами запросы вызываются через статический метод, а не через объект?
Статические методы AR это что-то вроде построителя запросов.

Что касается многие ко многим:

$article->articleAuthor->authors - последовательный неявный вызов getArticleAuthor у модели Article, и getAuthors у модели ArticleAuthor
Фигурирует три модели: Article, ArticleAuthor, Author, где ArticleAuthor - модель промежуточной таблицы и работает всего с двумя основными полями: article_id, author_id.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DaFive
@DaFive
В модели и объявите
public function getTags()
{
    return $this->hasMany(Tags:classname() (или какой у вас там класс тегов), ['article_id' => 'id']);
}

var_dump($article->tags);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы