Задать вопрос

Как сделать так, чтобы таблицы связывались по ключу?

Имеются две таблицы - comments и post, нужно связать эти таблицы по ключу 'author_id' => 'id'. Я попытался это сделать, но в ответ ничего не приходит.

Post.php
<?php

namespace frontend\models;

use Yii;
use yii\db\Connection;
use yii\helpers\ArrayHelper;

/**
 * This is the model class for table "post".
 *
 * @property int $id
 * @property int $user_id
 * @property string $filename
 * @property string $description
 * @property int $created_at
 * @property int $complaints
 */
class Post extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'post';
    }

    public function getComments()
    {
        $this->hasMany(Comments::class, ['post_id' => 'id']);
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'user_id' => 'User ID',
            'filename' => 'Filename',
            'description' => 'Description',
            'created_at' => 'Created At',
        ];
    }
}


Comments.php
<?php

namespace frontend\models;

use Yii;

/**
 * This is the model class for table "comments".
 *
 * @property int $id
 * @property int $author_id
 * @property int $post_id
 * @property string $comment_text
 * @property int $created_at
 */
class Comments extends \yii\db\ActiveRecord
{
    /**
     * {@inheritdoc}
     */
    public static function tableName()
    {
        return 'comments';
    }

    public function getPost()
    {
        $this->hasOne(Post::class, ['id' => 'post_id']);
    }

    /**
     * {@inheritdoc}
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'author_id' => 'Author ID',
            'post_id' => 'Post ID',
            'comment_text' => 'Comment Text',
            'created_at' => 'Created At',
        ];
    }
}


Экшен:
/**
     * View post
     * @param $id
     * @return string
     */
    public function actionView($id)
    {
        /* @var $currentUser User */
        $currentUser = Yii::$app->user->identity;

        $post = Post::findOne($id);

        // именно эта переменная пуста, хотя должна содержать комментарии
        $comments = $post->comments;


        echo '<pre>';print_r($comments);die;

        $commentsForm = new CommentsForm();

        return $this->render('view', [
            'post' => $this->findPost($id),
            'currentUser' => $currentUser,
            'comments' => $comments,
            'commentsForm' => $commentsForm,
        ]);
    }
  • Вопрос задан
  • 74 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
inoise
@inoise
Solution Architect, AWS Certified, Serverless
public function getPost()
    {
        return $this->hasOne(Post::class, ['id' => 'post_id']);
    }


Ну и аннотации напишите, конечно
Ответ написан
Комментировать
slo_nik
@slo_nik Куратор тега Yii
Добрый день.
Замените
$post = Post::findOne($id);
На
$post = Post::find()->with('comments')->where('id=:id', [':id' => $id])->one();
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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