Я новичок в 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
. ? Для этого я хочу сделать отношения в файле модели стихов, которые вернут доступные мне языки, поэтому как получить результат в представлении.? и какими будут изменения в стихотворной модели, представлении и контролере, если произойдут какие-либо изменения.
Я написал 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'), ); }
Я написал вам ваш код 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();
btw Я не читал все ваши сообщения, просто прочитал ваш 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'),
это отношение займет все строки перевода стихов конкретного идентификатора стиха, если у вас 10 разных переводов на 10 разных языках с verse_id 1, он отобразит все. Теперь вы можете видеть, что в строке verse_translation есть language_id.
Таким образом, мы можем получить все языки с помощью этого language_id.
Теперь мы делаем другое отношение, относящееся к language_id через verseTranslations, и это отношение отобразит все переведенные языки.
'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
Надеюсь, это поможет.
Если вам нужна помощь, оставьте сообщение в поле комментариев.
Благодарю.