Kohana Вопрос по связям

gabarai

Новичок
Вопрос в связях, никак не могу разобраться
Делаю мультиязычность. Структура таблиц такая:
Photogalleries[id, url]
Phototext[id, photo_id, description, lang]

В модели Photogallery сделал связь:
PHP:
 protected $_has_many = array(
 ‘phototext’ => array(
 ‘model’ => ‘phototext’,
 ‘foreign_key’ => ‘photo_id’,
 ),
 );
Как сделать выборку изображений (ORM::factory('photogallery')->find_all()) только с текущим языком (ну например при lang=’ru’)?
 

gabarai

Новичок
ORM::factory('photogallery')->where('lang', '=', $language)->find_all() Не срабатывает, потому что поле lang в таблице phototext, а не в photogallery
 

gabarai

Новичок
Может быть связи как-то по другому построить нужно и запрос строить иначе?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
А что ты выбрать-то пытаешься? Если у тебя у фотогаллерей нет языка, очевидно что ты по нему их не выберешь.
 

gabarai

Новичок
А какой выход тогда? Это пример одной из пар таблиц, в других больше параметров будет (дата, автор, алиас и т.д.)
Хранить все в одной таблице, дублируя эти данные у разных языков думаю неправильно.
 

gabarai

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

флоппик

promotor fidei
Команда форума
Партнер клуба
Если ты хочешь выбрать фотки, зачем выбираешь в модель галереи?
 

gabarai

Новичок
Photogalleries[id, url] тут url изображения (ну или имя). А тут Phototext[id, photo_id, description, lang] description - это текст
Например Photogalleries [10, photo1.jpg]
Phototext[1, 10, My photo, en]
Соответственно выбираю все фотки из модели photogallery
 

AmdY

Пью пиво
Команда форума
gabarai
ну так выбирай модель, а не аттрибуты, коими в твойм случае является Photogalleries
PHP:
$items = ORM::factory('phototext')->where('lang', '=', $language)->find_all();
foreach($items as $item) {
   echo $items->id, ' - ', $items->photo->url;
}
соотвественно
photo - это связь belongs_to в модели Phototext на Photogalleries
 

gabarai

Новичок
Спасибо! То что нужно!
А если я редактирую какую-то запись, то передую id, date, description.
Мне нужно отдельно грузить 2 модели и изменять по отдельности? т.е.
PHP:
ORM::factory('photogallery', $id)->set('date', $date) и 
ORM::factory('phototext')->set('description', $description)->where('page_id','=', $id)
 

AmdY

Пью пиво
Команда форума
Иделогически верно тащить через связь, да и гемора сразу и в последствии меньше.
PHP:
$item = ORM::factory('phototext')->where('page_id','=', $id);
$item->set('description', $description)->save();
$relation = $item->photo;
$relation->set('date', $date)->save();
я два дня только с фреймворком работал, так что код может не совсем корректно работать, доку чуть что нашёл нормальную здесь http://kohana3.ru/module/orm#связи
 

флоппик

promotor fidei
Команда форума
Партнер клуба
PHP:
$item = ORM::factory('Phototext', $id);
$item->description = $description;
$item->photo->date = $date;
$item->save();
Достаточно.
И - имена моделек с большой буквы, иначе на линупсе не заведется потом норм.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
По-хорошему это конечно надо как-то так:

PHP:
$item = ORM::factory('Phototext', $id);
if (!$item->loaded())
{
  throw new HTTP_Exception_404;
}
try {
$item->description = $description;
$item->photo->date = $date;
$item->save();
} catch (ORM_Validation_Exception $e)
{
  var_dump($e->errors());
}
 
Последнее редактирование:
  • Like
Реакции: AmdY

gabarai

Новичок
Ну я так и сделал, только еще редирект на 404 страницу добавил.
Всем большое спасибо! Очень помогли
 
Сверху