Вам необходимо настроить первичные ключи и внешние ключи, как описано в уже указанной ссылке .
Судя по приведенному примеру отношения:
- Item HasOne Item_Locale
- Item_Locale принадлежит к Item
- Item HasMany Категории
- Категория принадлежит предмету
- Категория HasOne Category_Locale
- Category_Locale BelongsTo Category
Запрос будет выглядеть примерно так:
$items = Model_Item::query()
->related('locale')
->related('categories')
->related('categories.locale')
->where('SellerID', $sellerID)
->get();
Я предполагаю, что локали не меняются во время выполнения, но не могут быть жестко закодированы. В этом случае вам нужно что-то вроде следующего. Начните с настройки условий по умолчанию, которые всегда являются частью отношений. Их необходимо добавить к определению отношений в моделях, как в следующем примере, который будет в Model_Item.
protected static $_has_one = array(
'locale' => array(
'model_to' => 'Model_Item_Locale',
'key_from' => 'ItemId',
'key_to' => 'ItemId',
'conditions' => array(
'join_type' => 'inner',
'where' => array(),
),
),
);
Я еще не мог добавить фактическое условие where, поскольку оно должно быть динамическим, и вы не можете иметь его в определении свойства класса. Таким образом, мы добавим миллисекунду, в которую загружен класс:
public static function _init()
{
$culture_id = ; // get that from somewhere
static::$_has_one['locale']['where'][] = array('CultureId', '=', $culture_id);
}
Это будет добавляться к присоединяемой части каждый раз, после сопоставления primarykey-foreignkey.
Запрос вернет набор элементов, которые будут иметь информацию о локали внутри свойства и иметь массив категорий, каждый из которых имеет свое собственное свойство локали, описывающее их.
foreach ($items as $i)
{
echo $i->locale->Name;
foreach ($i->categories as $c)
{
echo $c->locale->Name;
}
}