отношение многие ко многим в КИ (без использования ORM) - PullRequest
2 голосов
/ 04 января 2011

Я внедряю систему категорий в своем приложении CI и пытаюсь найти лучший способ работы со многими отношениями.

На данном этапе я не использую ORM, но могу использовать, например, Doctrine.

Каждая запись может иметь несколько категорий.

У меня есть три таблицы (упрощенно)

Entries:               entryID, entryName
Categories:            categoryID, categoryname
Entry_Category:        entryID, categoryID

мой код CI возвращает набор записей, подобный этому:

entryID, entryName, categoryID, categoryName

но, как и следовало ожидать в отношениях «многие ко многим», каждая «запись» повторяется для каждой «категории».

Какой наилучший способ «сгруппировать» категории, чтобы при выводе результатов у меня оставалось что-то вроде:

Entry Name
Appears in Category: Foo, Bar

вместо:

Entry Name
Appears in Category: Foo

Entry Name
Appears in Category: Bar

Я полагаю, что вариант заключается в том, чтобы отслеживать, соответствует ли идентификатор записи предыдущей записи, и, если да, сохранять соответствующую категорию и выводить ее как одну, а не как несколько, но я не уверен, как это сделать в CI. 1022 *

спасибо за любые ссылки (я понимаю, что это может быть неопределенным / сложным вопросом без лучшего знания системы).

Ответы [ 2 ]

1 голос
/ 04 января 2011

я создал помощника для этого

function has_many( $results, $child_table, $parent_key, $child_key ){


if( count( $results ) == 0 ){
    return $results;
}


$CI = &get_instance();

$ids = array();
$result_len = count( $results );

for ($i=0; $i < $result_len; $i++) { 
    array_push( $ids, $results[ $i ][ $parent_key ] );
    $results[ $i ][ $child_table ] = array();
}


$q = $CI->db->where_in( $child_key, $ids )->get( $child_table );
$children = $q->result_array();

foreach( $children as $child ):

for ($i=0; $i < $result_len; $i++) { 
    if( $results[ $i ][ $parent_key ] == $child[ $child_key ] ){
        array_push( $results[ $i ][ $child_table ], $child );
    }
}

endforeach;
return $results;

}

пример использования

$q = $this->db->get( 'parent_table' );
$nested_result = has_many( $q->result_array(), 'child_table', 'id', 'parent_table_id' );
print_r( $nested_result );

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

$q = $this->db->get( 'parent_table' );
$this->db->order_by( 'some_field', 'ASC' );
$nested_result = has_many( $q->result_array(), 'child_table', 'id', 'parent_table_id' );
print_r( $nested_result );
1 голос
/ 04 января 2011

Нажмите выбор категории на второй выбор. Для каждой записи записи введите идентификатор записи в этот выбор

select c.categoryID, c.categoryname
from category c
join entry_category ec on ec.categoryID = c.categoryID
where ec.entryID = ?

Кроме того, если разрабатываемая вами схема категоризации эквивалентна тому, что в блогах и других социальных сетях называется тегами или фолксономией, вам следует рассмотреть возможность использования стороннего пакета, такого как freetag

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...