Может ли FuelPHP ORM обрабатывать эту базу данных? - PullRequest
3 голосов
/ 29 декабря 2011

Мне интересно, может ли 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 Ответ

6 голосов
/ 02 января 2012

Вам необходимо настроить первичные ключи и внешние ключи, как описано в уже указанной ссылке .

Судя по приведенному примеру отношения:

  • 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;
    }
}
...