Yii, отношение с тем же именем, что и FK, поле переименования

0

У меня проблема с моей моделью, потому что у меня есть отношения, которые имеют то же имя, что и столбец FK.

class Post extends CActiveRecord {
  public function relations() {
    return array(
      'user' => array(self::BELONGS_TO, 'User', 'user')
    );
  }
}

Как сопоставить столбец user с чем-то другим, чтобы я мог получить доступ как к отношениям, так и к FK под разными именами? Я не могу изменить столбец базы данных, потому что от него зависят другие приложения.

Я хочу иметь возможность сделать это:

$post = Post::findByPk(1);
$post->user_id; // returns foreign key
$post->user; // returns activerecord

Ниже реализация также будет прекрасной, но с использованием вышеуказанного отношения Yii просто возвращает [0=>1242] для пользователя $post->user.

$post->user;
$post->user->user_id;

Я специально НЕ хочу что-то вроде этого:

$post->user; // Returns FK
$post->userobject; // Returns ActiveRecord. Ugly!

TL;DR: как мне сопоставить столбец FK с другим атрибутом, чтобы он не противоречил отношению.

Теги:
orm
yii

1 ответ

0
Лучший ответ

Насколько я вижу, ваша модель FK в модели Post для модели пользователя - user_id а не user.

$post->user_id; // returns foreign key

Если это не так, просто измените модель Post на эту форму, где user_id хранит идентификатор соответствующей модели пользователя.

Итак, вы делаете так:

public function relations() {
 return array(
  'user' => array(self::BELONGS_TO, 'User', 'user_id')
 );
}

Теперь не должно быть конфликтов, и вы сможете делать все, что пожелаете:

$post = Post::findByPk(1);
$post->user_id; // returns foreign key
$post->user; // returns activerecord

Обновить

Я только что заметил:

Я не могу изменить столбец базы данных, потому что от него зависят другие приложения.

Вид плохой конструкции приложения.

Я специально НЕ хочу что-то вроде этого:

$post->user; // Returns FK
$post->userobject; // Returns ActiveRecord. Ugly!

как сопоставить столбец FK с другим атрибутом, чтобы он не противоречил отношению

Я бы не сделал таких вещей:

function getUser_id(){
    return $this->user;
} 

Кажется неразрешимой ситуацией, потому что вы пытаетесь избежать $post->userobject !

Как насчет $post->userModel? Если вы настаиваете на том, чтобы user FK и user качестве ссылки на соответствующую модель могли попасть в долгосрочную колею.

  • 0
    $post->related_user для модели объекта выглядит более семантические :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню