CakePHP Вытащить данные из двух таблиц - PullRequest
0 голосов
/ 16 июля 2011

В моем приложении две таблицы: «Клиенты» и «Назначения»

В таблице встреч у меня есть внешний ключ, называемый «clientid», который связывает таблицы вместе. Как бы показать встречи для этого пользователя?

Так, например, при просмотре клиента /admin/clients/view/201/ я бы посмотрел сведения о клиенте для клиента 201, а также назначения для этого клиента.

Пока мой контроллер выглядит так:

class ClientsController extends AppController
{
    var $name = 'Clients';

    function beforeFilter()
    {
        parent::beforeFilter();
        $this->Auth->allow(array('*'));  
    }

    function admin_view($id = null)
        {
            $this->Client->id = $id;
            $this->set('client', $this->Client->read());
        }

Любая помощь будет высоко ценится. Спасибо

Редактировать: модель клиента

class Client extends AppModel
{
    var $name = 'Client';

    var $useTable = 'clients';
}

Редактировать2: просмотр

    <h1><?php echo $client['Client']['lastname']; ?> <?php echo $client['Client']['firstname']; ?> (<?php echo $this->Html->link('Edit', array('action' => 'edit', $client['Client']['id'])); ?>)</h1>

    <p><strong>Date of Birth:</strong> <?php echo $client['Client']['dateofbirth']; ?></p>

    <h3>Appointments</h3>

<table>
    <?php foreach ($appointments as $appointment): ?>
        <tr>
            <td>
                <?php echo $this->Html->link($appointment['Appointment']['date'],
                array('admin' => true, 'controller' => 'appointment', 'action' => 'view', $appointment['Appointment']['id'])); ?>
            </td>
        </tr>
    <?php endforeach; ?>
</table>

Ответы [ 3 ]

0 голосов
/ 17 июля 2011

Вам необходимо установить hasMany связь между Client -> Appointment моделями (см. документы , точно так же, как User -> Comment ассоциация), и наоборот belongsTo связь между Appointment -> Client (см. тот же документ).

Если таблицы и ключи вашей БД названы в соответствии с Соглашениями Cake и вы используете PHP 5, это все, что вам нужно:

class Client extends AppModel
{
    var $hasMany = 'Appointment';
}

class Appointment extends AppModel
{
    var $belongsTo = 'Client';
}

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

0 голосов
/ 17 июля 2011

вы должны вместо этого назвать внешний ключ 'client_id'.Таким образом, когда вы запекаете его, Cake может автоматически установить соединение.Кроме того, для вашей текущей цели, рекурсивный = 1 будет хорошо.Но я бы посоветовал заглянуть в Containable.Это очень полезный инструмент.

0 голосов
/ 16 июля 2011

Убедитесь, что в ваших моделях установлены обе ассоциации. то есть в модели клиента существует ассоциативная связь hasMany с внешним ключом client_id, а в модели назначений существует принадлежность к внешнему ключу client_id. Если все в порядке, проверьте, если в ваших контроллерах вы вызываете find с рекурсивным значением больше -1. ​​

    $this->Client->find('all', 'recursive' => 1);

Теперь в вашей модели клиента у вас должно быть поле $ hasMany, как показано ниже

    var $hasMany = array(
    'Appointment' => array(
        'className' => 'Appointment',
        'foreignKey' => 'client_id',
        'dependent' => false,
        'conditions' => ''
    )

И в действии контроллера, где вам нужно извлечь все связанные данные, например, в вашем действии admin_view используйте

    $this->set('client', $this->Client->find('first', 'recursive' => 1));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...