@Pios88

Как настроить связи между моделями в Yii2?

Задача выполняется на Yii2. Есть 2 модели Book и Author, есть 2 таблицы в базе MySQL book и author. В author храниться id и name автора. В book кроме всего прочего есть author_id идентифицирующий автора книги. Через BookController во View выводится циклом все нужные поля из таблицы book, но кроме этого нужно вывести еще и имя автора. Но так как знание матбазы у меня ниже плинтуса сделать этого не получается. Документация не спасла, по аналогии и 100500 найденных примеров сделать не получилось, что-то упускаю видимо.
Модель book:
<?php
namespace app\models;
use yii\db\ActiveRecord;

class Book extends ActiveRecord {
    
    public static function tableName() {
        return 'book';
    }
    
}

Контроллер BookController:
<?php
namespace app\controllers;
use yii\web\Controller;
use app\models\book;
use app\models\author;

class BookController extends Controller {
        
    public function actionIndex() {
        
        $book = Book::find()->select('image, title')->all();

        $author = 'Тут будет имя автора';
        
        return $this->render('index', compact('book', 'author'));
    }
    
}

Представление:
<div class="col-sm-12 col-md-12">
<?php if(!empty($book)); ?>
<?php foreach($book as $book): ?>
  <div class="col-sm-6 col-md-3 row" style="margin: 20px auto 20px auto;">
    <div class="thumbnail">
      <img src="<?=$book->image?>" alt="...">
      <div class="caption">
        <h3><a href="#"> <?=$book->title?> </a></h3>
        <p> <?=$author ?></p>
      </div>
    </div>
  </div>
<?php endforeach; ?>
</div>
</div>

Код даю без ереси, которую я пытался использовать. Подскажите где чего и какими методами нужно вызвать, чтобы получить имя автора на выходе. Просто безмерно буду благодарен, уже устал чувствовать себя безмерно тупым:)
  • Вопрос задан
  • 309 просмотров
Решения вопроса 1
php10
@php10
Разработчик на PHP
В прошлом ответе я давал ссылки. Почитайте внимательнее.

Представим структуру book:
id|name|author_id

и представим структуру author:
id|name

Напишем два класса:
<?php
class Author extends ActiveRecord
{
    public static function tableName()
    {
       return 'author';
    }

    pubic static function primaryKey()
    {
        return ['id'];
    }
}

class Book extends ActiveRecord
{
    public static function tableName()
    {
       return 'book';
    }

    public static function primaryKey()
    {
        return ['id'];
    }

    public function getAuthor()
    {
        return $this->hasOne(Author::className(), ['id' => 'author_id']);
    }
}

// Использование:
$books = Book::find()->all();
foreach ($books as $book) {
   echo $book->author->name; // сработает метод getAuthor() из Book
}


Если вы сейчас не поймете ничего, то я не знаю, чем вам помочь)) В методе getAuthor() мы использовали связь hasOne.

Почитайте внимательно вот эту страницу:
https://github.com/yiisoft/yii2/blob/master/docs/g...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

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

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