CakePhp:使用重命名的Model字段实时关联?

时间:2010-08-11 19:26:32

标签: cakephp associations

我正在尝试使用飞行关联来减少我检索的数据,但我正在使用的模型与其他具有重命名字段的模型相关联,因为我有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);

然后,something1和something2数据不会出现在模型'test'的'User'字段中,但仍会在'User_watched'字段中检索。

我是否可以为“User_watched”字段检索不需要的数据?

希望这有道理......:)

3 个答案:

答案 0 :(得分:2)

  

使用飞行关联进行修剪   我检索的数据

好主意。

'foreignKey' => 'user_id_watched' 

应该是:

'foreignKey' => 'user_watched_id'

编辑1:根据我目前的理解,至少这是有意义的。如果user_id是正确的外键(FK),哪个cakephp用于取消绑定关系,但user_id_watched不是,则解释了您描述的行为。

编辑2:可包含的行为为您提供了另一种用于控制相关模型的工具。

答案 1 :(得分:2)

KcYxA,

在这种情况下,可控行为可能会有很大帮助,正如本杰明所说,你的“查找”查询看起来像:

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

在这种情况下,您不必使用unbindModel方法。在此示例中,您将获得User和UserWatched数据。 如果您只需要“查找”中的用户数据,请告诉Cake“$ this-> User-> contains();”所以用户模型不会更进一步。

答案 2 :(得分:0)

在fly中更改$ primaryKey,运行控制器 样品:

//模型

// ...

class PreProductoDescripcion扩展了AppModel {

/**
 * Primary key field
 *
 * @var string
 */
public $primaryKey = 'id_producto_descripcion';

//....
//....

}

类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'
                                    )
                                )
                            ),
                        )
                    ));
//...