【问题标题】:How to get data from Relations with joins in yii如何在 yii 中通过连接从关系中获取数据
【发布时间】:2013-11-26 09:29:24
【问题描述】:

我是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代码生成器生成了诗歌模型。

My 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'),
 );
}

【问题讨论】:

    标签: php yii


    【解决方案1】:

    我给你写了你的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
    

    告诉我做了什么

    干杯

    【讨论】:

    • 感谢您的帮助,请阅读我的整篇文章,因为实际上我想在我的模型中创建关系,这样我就可以直接在视图中获得结果,例如 $model->language_name,我认为它进来了数组。
    • 如果您仍然卡住,请向我展示您与生成的模型的关系。
    • 你试过$allLangs = $vers->language_name吗?
    【解决方案2】:

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

    先看看吧。

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

    此关系将获取特定诗句 id 的所有诗句翻译行,这意味着如果您有 10 种不同语言的 10 种不同翻译,其 verse_id 为 1,它将显示全部。现在您可以看到有问题的 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

    希望它会有所帮助。

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

    谢谢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-13
      • 2021-10-16
      • 2021-08-05
      相关资源
      最近更新 更多