Группировать записи в CakePHP по первой букве? - PullRequest
1 голос
/ 26 февраля 2012

Я хочу получить и сгруппировать записи из таблицы базы данных по первой букве. Так, например:

A
Альфред

B
Brian

C
Christopher

...

В идеале я хотел бы, чтобы моя структура данных выглядела следующим образом:

Array
(
    [A] => Array
    (
        [0] => Array
        (
            [Person] => Array
            (
                [id] => 12
                [name] => Alfred
            )
        )
    )
)

Я мог бы сделать это с необработанным MySQL-запросом, но не уверен, поддерживает ли CakePHP это из коробки. Я просто буквально хочу сгруппировать записи, чтобы я мог перебирать их и создавать неупорядоченный список для каждой буквы:

<h2>A</h2>
<ul>
  <li>Alfred</li>
</ul>
<h2>B</h2>
<ul>
  <li>Brian</li>
</ul>
<h2>C</h2>
<ul>
  <li>Christopher</li>
</ul>
...

Ответы [ 2 ]

0 голосов
/ 27 февраля 2012

Попробуйте это:

$peoplebyletter = array();

foreach($people as $person){
    $peoplebyletter[strtolower(substr($person['Person']['name'], 0, 1))][] = $person;
}

debug($peoplebyletter);

Не проверено.Дайте мне знать, если это работает.

0 голосов
/ 27 февраля 2012

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

$people = $this->Person->find('all', array(
    'order' => 'Person.name ASC'
));

И тогда вы можете сделать:в представлении, поэтому вам не нужно повторять его дважды:

<ul>
<?php $letter = 'first'; ?>
<?php foreach ($people as $person) : ?>
    <?php $firstLetter = strtolower(substr($person['Person']['name'], 0, 1)); ?>
    <?php if ($firstLetter !== $letter) : ?>
        <?php if ($letter !== 'first') : ?>
            </ul></li>
        <?php endif; ?>
        <?php $letter = $firstLetter; ?>
        <li><h2><?php echo $firstLetter; ?></h2><ul>
    <?php endif; ?>
    <li><?php echo $person['Person']['name']; ?></li>
<?php endforeach; ?>
</ul></li></ul>

Я бы не знал, как получить эту структуру, просто используя вызов find (за исключением 26 вызовов или создания таблицы БДсодержит все буквы), и я не понимаю, почему это было бы необходимо.

Надеюсь, это поможет!(ps-код не проверен ... но вы понимаете, если будут какие-либо опечатки)

...