Может ли FuelPHP ORM обрабатывать эту базу данных?
Мне интересно, может ли Fuel ORM справиться с дизайном, описанным здесь:
http://www.codeproject.com/KB/aspnet/LocalizedSamplePart2/normalizedSchema.gif
Следующий SQL, или, может быть, что-то похожее, должен быть сгенерирован и выполнен:
SELECT CultureId
FROM Culture WHERE CultureName = @CultureName
SELECT I.ItemId, IL.[Name], IL.[Description],
I.Price, CL.[Name], CL.[Description]
FROM Item I
INNER JOIN Item_Locale IL ON I.ItemId = IL.ItemID AND IL.CultureId = @CultureIdD
INNER JOIN Category C ON I.CategoryId = C.CategoryId
INNER JOIN Category_Locale CL ON C.CategoryID = CL.CategoryId AND CL.CultureId = @cultureId
WHERE I.SellerId = @SellerID
Или я должен использовать нормальные запросы?
Пожалуйста, порекомендуйте.
1 ответ
Вам необходимо настроить первичные ключи и внешние ключи, как описано в приведенной ссылке.
Судя по приведенному примеру, отношения таковы:
- Item HasOne Item_Locale
- Item_Locale Принадлежит Предмету
- Пункт HasMany Категории
- Категория принадлежит предмету
- Категория HasOne Категория_Locale
- Category_Locale Принадлежит к категории
Запрос будет выглядеть примерно так:
$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;
}
}