我是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表的外键引用。
现在我的问题是。
我想获得具有特定verse_id
的可用翻译的语言列表?为此,我想在verse模型文件中建立关系,该文件将在我的视图中返回可用的语言,那么如何在视图中获得结果呢。?以及如果发生任何变化,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代码生成器生成了verse模型。
我的Verse模型关系函数。
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'),
);
}
我为您编写了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
让我知道做了什么
欢呼
您可以很容易地从语言表中获得可用翻译语言的列表。
让我们先看看。
'verseTranslations' => array(self::HAS_MANY, 'VerseTranslations', 'verse_id'),
这个关系将获取特定verse id的所有行的verse翻译,意味着如果你有10种不同语言的10种不同翻译,verseid为1,它将显示所有。现在您可以看到有问题的verse_translation表有language_id。
因此,我们可以通过该language_id获取所有语言。
现在我们通过verseTranslations建立另一个与language_id相关的关系,这个关系将显示所有翻译的语言。
'verse_lang' => array(self::HAS_MANY, 'Language', array('language_id'=>'id'), 'through'=>'verseTranslations'),
因此,正如我所写的,Sql查询等价于这两种关系。
'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-通过查询
希望它能有所帮助。
如果您需要任何帮助,请在评论框中留言。
谢谢。