2013-09-04 1 views
0

У меня было много проблем с has_many-through отношениями, но в конце концов я нашел хороший пример here, который решил большинство моих проблем. Однако, согласно приведенному ниже коду, у меня есть пара вопросов.
, во-первых, код:Kohana ORM - имеет много сквозных моделей, хранящихся в родительской модели

$artists = ORM::factory('artist')->find_all(); 
foreach ($artists as $artist) 
{ 
    foreach ($artist->media->find_all() as $m) 
    { 
     echo $m->name; 
    } 
} 

1) В этом примере, вероятно, контроллер. Что делать, если я хочу хранить media в $artists, чтобы отправить одну переменную для просмотра? Можно ли хранить media в качестве медиа-свойства в объекте исполнителя? (Я имею в виду, например, $artists[0]->media[0]->name)
2) Можно ли полностью загрузить $artists без этой петли?

+0

Почему вы не создать функцию с именем 'медиа ($ ключ = NULL)' в вашем объекте художника, и пусть возвращающие массив или один объект? Это было бы просто «$ artist» [0] -> media (0) -> name' с '$ key', оставшимся целым массивом, так же возможна быстрая интеграция кеширования. – AmazingDreams

ответ

1

1) Если я правильно понял, что вам нужно, чтобы получить какой-то элемент из медиа

$artists = ORM::factory('artist')->find_all()->as_array(); 
$media = $artists[0]->media->find_all()->as_array(); // media of first artist 
$name = $media[0]->name; 

2) См выше $ художников является массивом ОРМ объектов

+0

Нет, я хочу иметь все в одной переменной '$ artist' (включая медиа для каждого исполнителя). Но спасибо за ваш ответ, так или иначе :) – David

0

После моего комментария, это то, что я Да.

class Model_Artist extends ORM { 

    /// 
    /// Whatever you have now 
    /// 

    private $_media_cache = NULL; 

    public function media($key = NULL) 
    { 
     // Check cache 
     if($this->_media_cache == NULL) 
     { 
      $this->_media_cache = $this->media->find_all(); 
     } 

     if($key !== NULL) 
     { 
      // Use Arr::get in case index does not exist 
      // Return empty media object when it does not exist so you can 
      // 'harmlessly' ask for its properties 
      return Arr::get($this->_media_cache, $key, ORM::factory('Media')); 
     } 

     return $this->_media_cache; 
    } 
} 

Callable в

$artists[0]->media(0)->name