Еще одна «нужно вытащить данные из двух таблиц в cakephp» - PullRequest
0 голосов
/ 13 декабря 2011

Хорошо, у меня есть две таблицы: пользователи и устройства.'Unit' принадлежит 'User', а 'User' имеетMany 'Unit'.Я хотел бы получить доступ ко всем данным из моей таблицы единиц измерения и добавить некоторые данные из моей таблицы пользователей для просмотра.Вот мой код контроллера:

public function condos() {
    $u=$this->User->Unit->find('all', array('conditions'=>array('type'=>'condo',     'active'=>1)));
    $this->set('allcondos', $u);
}

У меня есть две модели, User и Unit, вот код для них: из unit.php:

class Unit extends AppModel {
    var $name='Unit';
    var $belongsTo=array(
        'User'=>array(
        'className'=>'User',
        'foreignKey'=>'user_id'
    ) );
}

и из user.php:

class User extends AppModel {
    var $name='User';
    var $hasMany=array(
        'Unit'=>array(
        'className'=>'Unit',
        'foreignKey'=>'user_id'
    ) );
}

Вот мой код просмотра:

<?php foreach ($allcondos as $condo) { ?>

<section class="listings">
<figure>
<img src="<?php echo $condo['Unit']['photo1']; ?>" />
</figure>
<h1><?php echo $condo['Unit']['complex'], ' ', $condo['Unit']['unitnum']; ?></h1>
<h2><?php echo $condo['Unit']['city']; ?>, <?php echo $condo['Unit']['state']; ?> | (<?php echo $condo['User']['area_code']; ?>)<?php echo $condo['User']['exchange'];?>-<?php echo $condo['User']['sln'];?></h2>
<p><?php echo $condo['Unit']['unit_desc']; ?></p>
</section>
<?php } ?>

У меня проблема с вызовом $ condo ['User'] ['any_field'], так как он возвращает ноль 'Данные пользователя.(Он возвращает данные «Юнит» просто отлично).Я не знаю, как получить доступ к обеим таблицам, очевидно.

Если я отлаживаю $ allcondos в представлении, это выглядит так:

Array
(
    [0] => Array
    (
        [Unit] => Array
            (
                [id] => 1
                [user_id] => caribeincrentals
                [additional fields] ...
            )

        [User] => Array
            (
                [id] => 
                [user_id] => 
                [additional fields] ...
            )

    )
    [1] => Array ...
)

Ответы [ 2 ]

1 голос
/ 13 декабря 2011
$this->Unit->find('all', array(
        'conditions' => array(
            'type' => 'condo',
            'active' => 1,
        ),
        'contain' => array(
            'User',
        ),
    ));

Используйте вмещаемое содержимое для получения связанных данных. Вы можете также использовать условия, которые содержат, чтобы ограничить, какую информацию вы хотите.

http://book.cakephp.org/view/1323/Containable

0 голосов
/ 13 декабря 2011

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

Я предлагаю изменить user_id fk на тип данных int, который ссылается на столбец ключа id в таблице Users (хорошо, если предположить, что id - это целочисленное значение с автоинкрементом).

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

UPDATE

Если вы структурируете свои таблицы в соответствии с соглашениями Cake, большая часть ассоциативной работы будет сделана для вас. Вот как бы я это сделал:

Таблица пользователей («пользователи»):

id        primary key (int)

Модель пользователя:

$hasMany = array( 'Unit' );

Таблица единиц ('единиц'):

id        primary key (int)
user_id   corresponds to id in users table

Модель устройства:

$belongsTo = array( 'User' );

Если вы настроите свои таблицы и модели таким образом, Cake автоматически свяжет 'user_id' в таблице единиц измерения с 'id' в таблице пользователей.

...