CakePhp: на лету ассоциации с использованием переименованного поля модели? - PullRequest
2 голосов
/ 11 августа 2010

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

Итак, вот модель, скажем 'test', которая имеет два поля 'user', оба относятся к модели User.

В модели:

  var $belongsTo = array( 
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id' 
    ),
    'User_Watched' => array(
        'className' => 'User',
        'foreignKey' => 'user_id_watched' 
    )
);

Когда я получаю данные, относящиеся к 'test', я хочу получить только определенные данные, связанные с полями 'User' и 'User_Watched', без какой-либо другой вложенной информации.

Но когда я делаю:

 $this->User->unbindModel(array('hasMany' => array('something1', 'something2')), false);

тогда данные что-то1 и что-то2 не отображаются для поля 'Пользователь' модели 'test', но все еще извлекаются для поля 'Пользователь_watched'.

Могу ли я не получить нежелательные данныедля поля 'User_watched'?

Надеюсь, это имеет смысл ...:)

Ответы [ 3 ]

2 голосов
/ 12 августа 2010

KcYxA,

Контейнерное поведение может сильно помочь в этом случае, как сказал Бенджамин, ваши запросы "поиска" будут выглядеть так:

$this->User->find('first', array(
      'conditions' => array('User.id' => $id),
      'contain'    => array('UserWatched')
    ));

В этом случае вам не придется использовать метод unbindModel. В этом примере вы получите данные User и UserWatched. Если вам нужны только данные пользователя из «find», то скажите Cake «$ this-> User-> Содержит ();» поэтому он не пойдет дальше, чем модель пользователя.

2 голосов
/ 12 августа 2010

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

Хорошая идея.

'foreignKey' => 'user_id_watched' 

должно быть:

'foreignKey' => 'user_watched_id'.

Редактировать 1: По крайней мере, это будет иметь смысл в соответствии с моим текущим пониманием.Если user_id является правильным внешним ключом (FK), который использует cakephp для отмены привязки отношений, а user_id_watched нет, то объяснение описанного вами поведения.

Редактировать 2: Поведение «Содержимое» дает вамеще один инструмент для управления связанными моделями.

0 голосов
/ 28 января 2014

Измените $ primaryKey на лету, запустите контроллер*

}

Класс SenasaPedidosDetalles расширяет AppModel {

/**
 * Display field
 *
 * @var string
 */
public $displayField = 'cod_tango';

public $belongsTo = array(
    'SenasaPedidos' => array(
        'className' => 'SenasaPedidos',
        'foreignKey' => 'senasa_pedidos_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'PreProductoDescripcion' => array(
        'className' => 'PreProductoDescripcion',
        'foreignKey' => 'cod_tango',
        //'conditions' => array('SenasaPedidosDetalles.cod_tango' => 'PreProductoDescripcion.codigo'),
        'fields' => '',
        'order' => ''
    )
);

// ....

#
// Controller Fly
//...
$this->SenasaPedidos->Behaviors->load('Containable');
$this->SenasaPedidos->SenasaPedidosDetalles->PreProductoDescripcion->primaryKey = 'codigo';
                    $datos = $this->SenasaPedidos->find(
                            'first', array(
                        'fields' => array( 'SenasaPedidos.*' ),
                        'conditions' => array( 'SenasaPedidos.id' => $id ),
                        'contain' => array(
                            'Usuarios' => array(
                                'fields' => array( 'Usuarios.apellido_nombre' )
                            ),
                            'Clientes' => array(
                                'fields' => array( 'Clientes.razon_social' )
                            ),
                            'Provincias' => array(
                                'fields' => array( 'Provincias.nombre' )
                            ),
                            'Transportes' => array(
                                'fields' => array( 'Transportes.razon_social' )
                            ),
                            'SenasaPedidosDetalles' => array(
                                'fields' => array( 'SenasaPedidosDetalles.*' ),
                                'PreProductoDescripcion' => array(
                                    'fields' => array(
                                        'PreProductoDescripcion.id_producto_descripcion',
                                        'PreProductoDescripcion.descripcion'
                                    )
                                )
                            ),
                        )
                    ));
//...
...