如何从yii中的连接关系中获取数据

时间:2013-11-26 09:29:25

标签: php yii

我是Yii的初学者,所以我问这个问题。

我有三张不同的牌桌。

第一张表

第一个表格是language(id, language_name)

// id是主键。

第二张表

第二张表是verse(id, topic_id, surah_id, verse_text)

// id是主键,

第三表

第三个表是verse_translations(id, verse_id, language_id, translations_text)

// id是主键,language_id是带有语言表的外键引用,

// verse_id是带有经文表的外键引用。

现在我的问题是。

我想获取具有特定verse_id的可用翻译语言列表。 ?为此,我想在我的视图中返回可用语言的verse模型文件中建立关系,那么如何在视图中获得结果。如果发生任何变化,将会对诗歌模型,视图和控制器进行哪些更改。

我编写了MySQL查询,如下所示。

SELECT language.language_name from language 
Inner Join verse_translations ON  verse_translations.language_id = language.id
Where verse_translations.verse_id = 1

但我在Yii中需要这个。

我通过gii代码生成器生成了经文模型。

我的诗歌模型关系功能。

public function relations()
{
 return array(
    'sorah' => array(self::BELONGS_TO, 'Sorah', 'sorah_id'),
    'topic' => array(self::BELONGS_TO, 'Topic', 'topic_id'),
    'verseFeedbacks' => array(self::HAS_MANY, 'VerseFeedback', 'verse_id'),
    'verseImages' => array(self::HAS_MANY, 'VerseImages', 'verse_id'),
    'verseLinks' => array(self::HAS_MANY, 'VerseLinks', 'verse_id'),
    'verseTafseers' => array(self::HAS_MANY, 'VerseTafseer', 'verse_id'),
    'verseTranslations' => array(self::HAS_MANY, 'VerseTranslations', 'verse_id'),
    'language_name' => array(self::HAS_MANY, 'Language', 'id'),
 );
}

2 个答案:

答案 0 :(得分:2)

我写了你的sql代码,

$result = Yii::app()->db->createCommand()
->select('l.language_name')
->from('language l')
->join('verse_translations vt' , 'l.id = vt.language_id ')
->join('verse v' , 'vt.id = v.id')
->where('v.id = :var' , array(':var'=>1))
->queryAll();

顺便说一句我没看完你的所有帖子,只读了你的sql:D

更新:如果你在生成模型文件之前在mysql中定义你的关系,你会得到为你生成的关系。这是最简单的方法,然后你可以这样做:

$vers = Ver::model()->findByPk(1);
$allLangs = $vers->language_name; // this will give you an array of Language Model back

让我知道做了什么

欢呼声

答案 1 :(得分:1)

您可以从语言表中轻松获取可用翻译语言的列表。

先看看。

'verseTranslations' => array(self::HAS_MANY, 'VerseTranslations', 'verse_id'),

这种关系将采用特定诗歌id的所有诗歌翻译行,意思是如果您使用verse_id 1在10种不同语言中有10种不同的翻译,它将显示全部。现在你可以看到有问题的verse_translation表有language_id。

因此我们可以通过该language_id获取所有语言。

现在我们通过verseTranslations创建另一个与language_id相关的关系,这个关系将显示所有翻译的语言。

'verse_lang' => array(self::HAS_MANY, 'Language', array('language_id'=>'id'), 'through'=>'verseTranslations'),

因此我编写的Sql Query相当于这两个关系。

'verseTranslations' => array(self::HAS_MANY, 'VerseTranslations', 'verse_id'),
'verse_lang' => array(self::HAS_MANY, 'Language', array('language_id'=>'id'), 'through'=>'verseTranslations'),

在视图中,我们可以通过var_dump($data->verse_lang)

轻松访问它

就是这样。

了解关系。您可以仔细阅读此链接。

http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-with-through

希望它会有所帮助。

如果您需要任何帮助,请在评论栏中留言。

感谢。