Структура зц, построение запроса

Печать RSS
540

I

Пришелец
0
ICE (4 Октября 2011 / 18:08)
http://mobilecms.ru/downloads/20 вот по такому примеру зц, со вложенными дирикториями и файлами, но там используется запрос с UNION
такой зц можно сделать и без того что ты предложил
I
Автор
Пришелец
0
30. убери с меня курсор, не угодил
30. убери с меня курсор, получается массив такой
array(
[0] => array(
dirname => ...
dirrefid => ...
И все файлы
)
[1] => array(
dirname => ...
dirrefid => ...
И теже самые файлы
)
);

Граф Озриор
0
32. ICE, почитай это (ссылка)

использовал USING(идентификатор); ?
С

Малиновые штаны
0
ого. вы гоните. нет чтобы сесть и продумать головой как будет лучше? но нет же надо делать как все - все в кучу. ну это конечно ваши проблемы и головная боль. Хотя вы даже не можете привести аргументов в пользу вашего метода. Как говорится "Ежик плакал, кололся но продолжал жрать кактус"
16. Егор в шортах, то что они есть еще не значит что они лучшие
Изменил: Саня
I
Автор
Пришелец
0
Прочитал вроде понял)спс

Граф Озриор
0
35. ICE, про left join?

2000 лет д.н.э.
0
ICE (4 Октября 2011 / 18:08)
http://mobilecms.ru/downloads/20 вот по такому примеру зц, со вложенными дирикториями и файлами, но там используется запрос с UNION
Я что то там самый обычный зц увидел, коттрому таких анальных путешествий не требуется.
З.ы. 2 запроса, 2 цикла, в которых все загоняется в один массив, предварительно отформатировав все в нужный вид, лучше все равно врят ли будет, юнион это те же 2 запроса на сколько я знаю, экономия только в отсылке данных, правда я не вникал, могу ошибаться..
A

Чатланин
0
так и есть впринципе. но сейчас делаю немного по другому - получаю отдельно объекты папок и отдельно объекты файлов (за вычетом оффсета папок), затем склеиваю в результатирующий объект. выглядит примерно так:

<?php
    /**
     * Get items for listing
     *
     * @param int $directory_id Directory id
     * @param int $limit Limit
     * @param int $offset Offset
     * @return stdClass
     */
    public static function items_for_list($directory_id = 0, $limit = 10, $offset = 10)
    {
        // Get directories
        $directories = ORM::factory('downloads_directory')
            ->where('parent_id', '=', $directory_id)
            ->limit($limit)
            ->offset($offset)
            ->reset(FALSE);
            
        $count_directories = $directories->count_all();
         
        // Get items   
        $items = ORM::factory('downloads_item')
            ->where('directory_id', '=', $directory_id)
            ->limit($limit - count($directories))
            ->offset($offset)
            ->reset(FALSE);
        
        $count_items = $items->count_all();
        
        // Result
        $result = new stdClass;
        
        $result->directories = $directories->find_all();
        $result->items = $items->find_all();
        $result->total_items = $count_directories + $count_items;
        
        return $result;
    }

Особо не тестировал еще, возможно будут баги с оффсетами. Такой подход очень удобный, этот метод можно использовать как в админке, так и во фронтах.
Изменил: Ant0ha
A

Чатланин
0
Забыл добавить листинг в отображении =):

<?php $i = 0; ?>
<div class="menu">
    <?php if ($count_items > 0): ?>
        <?php foreach ($directories as $directory): $i++; ?>
            <?php echo HTML::icon('directory.png') ?>
            <?php echo HTML::anchor(
                'downloads/list/' . $directory->id,
                $directory->name
            ) ?>
            (<?php echo $directory->count_items() ?>)
            
            <?php if ($count_items > $i) echo '<hr />' ?>
        <?php endforeach ?>
        
        <?php foreach ($items as $item): $i++; ?>
            <?php echo HTML::image($item->icon('default')) ?>
            <?php echo HTML::anchor(
                'downloads/view/' . $item->id,
                $item->name
            ) ?>
            <?php if ($count_items > $i) echo '<hr />' ?>
        <?php endforeach ?>
    <?php else: ?>
        <p><?php echo __('No files') ?></p>
    <?php endif ?>
</div>

Имхо, такой подход действительно избавляет от нежелательных "анальных путешествий", как в моделях и контроллерах, так и в отображениях, при этом выполняется в несколько строк кода.
Изменил: Ant0ha
Стикеры / Теги / Правила