CakePHP показывает другой атрибут, кроме ID

У меня проблема с CakePHP: вместо внешнего ключа таблицы отображается имя.

Настройки: 3 стола: игроки, команды, игры
3 модели
команды:
public $hasMany = 'Player';

Игроки:
public $belongsTo = 'Team';
Игры:
public $belongsTo = array( 'HTeam' => array( 'className' => 'Team', 'foreignKey' => 'hteam' ), 'ATeam' => array( 'className' => 'Team', 'foreignKey' => 'ateam' )

Я думаю, что с моделью все в порядке, потому что идентификаторы отображаются правильно, и я могу добавлять, удалять и т. Д. Так что все работает нормально. Единственное, что не работает, это показать название команды вместо идентификатора команды. В таблице игроков есть team_id в качестве внешнего ключа. Когда я хочу перечислить всех игроков, то появляется только team_id, а не имя со ссылкой на команду. Я пробовал много вещей, но я не был успешным. У меня такая же проблема, когда я перечисляю все игры.

Я попытался установить $displayField = 'name' в модели Teams, но не знаю, как вызвать имя в представлении, которым управляет Userscontroller.

PlayersController:
$this->set('players', $this->Player->find('all')); $teams = $this->Team->find('list', array('fields' => array('name'))); $this->set('teams', $teams);
также пробовал этот:
$teams = $this->Player->Team->find('list', array('fields' => array('name')));

Это код, с помощью которого я пытался показать имя:
<?php echo $this->Html->link($teams['Team']['name'], array('controller' => 'teams', 'action' => 'view', $teams['Team']['id'])); ?>

Но это не работает, потому что у меня нет team_id. Я думаю, что на этот вопрос уже был дан ответ, но либо я тупой, чтобы найти его, либо тупой, чтобы правильно его реализовать.....

Спасибо за вашу помощь!


person starstream    schedule 17.12.2014    source источник
comment
Пожалуйста, отформатируйте код ответов лучше, это беспорядок.   -  person floriank    schedule 17.12.2014


Ответы (2)


find('list') CakePHP не возвращает результат массивы, структурированные так же, как find('all').

После установки $teams он должен содержать

array(
    1 => 'Team 1 Name', 
    2 => 'Team 2 Name',
    ...
)

независимо от того, какой из двух методов вы использовали для его установки. Таким образом, попытка найти $teams['Team']['name'] не сработает, потому что массив не имеет такой структуры.

Вот фактический цикл, который вы должны использовать для вывода ссылок на каждую команду:

<ul>
    <?php foreach ($teams as $team_id => $team_name): ?>
        <li>
            <?php echo $this->Html->link(
                $team_name, 
                array(
                    'controller' => 'teams', 
                    'action' => 'view', 
                    $team_id
                )
            ); ?>
        </li>
    <?php endforeach; ?>
</ul>
person Phantom Watson    schedule 17.12.2014
comment
Спасибо за ответ. С помощью этого цикла я получаю сразу все названия и ссылки команд. Я хочу только команду игрока. Вот вид, который я использую <?php foreach ($players as $player): ?> <tr> <td><?php echo $this->Html->link($player['Player']['player_name'], array('controller' => 'players', 'action' => 'player_detail', $player['Player']['id'])); ?></td> <td><?php echo $player['Player']['birthdate']; ?></td> <td><?php echo $player['Player']['id']; ?></td> После этой строки должно следовать название команды со ссылкой. Спасибо заранее. - person starstream; 18.12.2014
comment
Затем вам нужно добавить специфичности вашему вызову Team::find(). В условиях вам нужно будет добавить 'Team.id' => $player['Player']['team_id']. Но если у вас только одна команда, вы можете сделать Team::find('first') вместо Team::find('list'). Вот документация CakePHP о find(). - person Phantom Watson; 18.12.2014
comment
Извините, что я еще не ответил. Я думаю, что я должен быть более конкретным. Когда я использую find(first), я получаю только команду с идентификатором 1 (если в этой команде есть игроки). Ваше первое предложение создало список всех команд... Но мне нужна таблица или что-то в этом роде, в которой должны отображаться все игроки (это легко найти (все)), а затем мне нужна конкретная команда игрока. Это означает, что я должен следовать идентификатору команды в таблицу Team. Я думаю, что я еще не понял эту концепцию. Я прочитал так много руководств и сообщений stackopverflow, но не смог разработать решение. :( - person starstream; 27.12.2014
comment
Если вам нужна таблица или что-то еще, в которой должны отображаться все игроки, похоже, вы должны вызывать find() в модели игрока. Если вы реализовали поведение Containable и определили вашим ассоциациям, связанная с каждым Игроком Команда будет по умолчанию включена в результаты find(), например $players[0]['Team']['name']. - person Phantom Watson; 29.12.2014

Спасибо за помощь Phanton Watsons. Решение слишком простое :(

Это find('all') в контроллере. В представлении это $player[Team][name].

Извините, что беспокою сообщество. Я не знаю, почему я не нашел решение раньше ..

person starstream    schedule 29.12.2014
comment
Рад слышать, что вы нашли свое решение. Не забудьте отметить этот вопрос как отвеченный. - person Phantom Watson; 29.12.2014
comment
Лучше пометить ответ, который уже был опубликован, как правильный, вместо того, чтобы помечать свой собственный комментарий как правильный. Это больше соответствует тому, как работает сайт. - person Phantom Watson; 09.02.2015