CakePHP单元属于复杂,但并非所有单元都有复杂?

时间:2012-01-30 16:15:44

标签: cakephp-2.0 cakephp-appmodel

我有一个'复杂'模型,它有很多单位。我的模型关联是正确的,一切正常,只是我无法让不同的模型/关联正常工作,这让我想知道我是否需要以不同的方式设置这个模型。

请参阅,并非所有单位都有与之关联的复合体。有些单位是房屋,有些单位是酒店房间,有些单位只是出租公司。

因为Complexes有很多单位我很想不管它,但我想知道我是不是应该重新定义这个关系作为Complex belongsTo Unit。我试图在我的数据库中重复添加同一个复合体的多个实例。

这是我目前的单位模型:

class Unit extends AppModel {
public $name='Unit';

public $belongsTo=array(
'User'=>array(
'className'=>'User',
'foreignKey'=>'user'
),
'Complex'=>array(
'className'=>'Complex',
'foreignKey'=>'complex_id'
)
);

public $hasOne=array(
    'Location'=>array(
        'className'=>'Location',
        'foreignKey'=>'location_id'
        )
    );

}

这是我目前的复杂模型:

class Complex extends AppModel {
    public $name='Complex';
    public $hasMany=array('Unit');
    public $hasOne=array(
        'Location'=>array(
            'className'=>'Location',
            'foreignKey'=>'location_id'
            )
        );






}

顺便说一下,'Location'是我遇到问题的模型(当我在视图中调用我的单位/复杂信息时,我的数组的位置部分当前返回空,所以我需要让我的关联正确)。
如果单位是一个复杂的公寓,我希望它返回复杂的位置。如果是房子或酒店或租赁公司,我希望它返回单位的位置。我必须做几个这样的关联(图像,位置等),所以我想让所有的东西都直接排在前面。

我目前在单位和复合体之间的关系是正确的还是我需要以不同的方式定义所有内容?

UPDATE 这是我的控制器逻辑:

$this->paginate['Unit']=array(
        'limit'=>9,
        'order' => 'RAND()',
        'contain'=>array(
                'User'=>array(
                    'email'),
                'Complex'=>array(
                    'id','complex_name', 'realname', 'photo1','photo2','photo3','photo4','photo5'),
                'Location'=>array(
                    'complex_id','address', 'city','state','zip','area_code','exchange','sln','lat','lon','website')
                ),
        'conditions'=>array(
                'Unit.type'=>array('condo', 'rentalco'),
                'Unit.active'=>1)   
    );
$data = $this->paginate('Unit');
$this->set('allcondos', $data);


}

你可以看到我得到的结果here:

我目前没兴趣显示所有Complexes的视图,但是索引页面逻辑确实将ContainableBehavior限制为仅仅复杂(原来我将获得各种Complexes的视图):

 public function index() {
    $this->Complex->Behaviors->attach('Containable');
    $this->Complex->contain();
    $c=$this->Complex->find('all');
    $this->set('complexes', $c);
    }

更新我现在正在为任何遇到此问题的人工作。我不得不将位置更改为根并使复杂属性位置。以下是我的模型更新:

class Location extends AppModel {
    public $name='Location';
    public $hasMany=array('Complex', 'Unit');
    var $belongsTo=array(


    'Restaurant'=>array (
        'className'=>'Restaurant',
        'foreignKey'=>'restaurant_id'
        )
    );


}

class Complex extends AppModel {
    public $name='Complex';
    public $hasMany=array('Unit');
    public $hasOne=array('Image');
    public $belongsTo=array(
        'Location'=>array(
            'className'=>'Location',
            'foreignKey'=>'location_id'
            )
    );






}


class Unit extends AppModel {
public $name='Unit';

public $belongsTo=array(
'User'=>array(
'className'=>'User',
'foreignKey'=>'user'
),
'Complex'=>array(
'className'=>'Complex',
'foreignKey'=>'complex_id'
),

'Location'=>array (
        'className'=>'Location',
        'foreignKey'=>'location_id'
        ),
);

public $hasOne=array('Image');

}

非常感谢Wylie的帮助,这真是太过分了!

1 个答案:

答案 0 :(得分:1)

http://book.cakephp.org/2.0/en/core-libraries/behaviors/containable.html?containing-deeper-associations#containing-deeper-associations

When using ‘fields’ and ‘contain’ options - be careful to include all foreign keys that your query directly or indirectly requires. Please also note that because Containable must to be attached to all models used in containment, you may consider attaching it to your AppModel.

您可以在AppModel中执行此操作:public $actsAs = array('Containable'); 你不必在不想要的时候使用Contain,这样就不会妨碍它。

当模型A具有模型B时,您使用模型B中的外键。因此,位置上的外键应为complex_id。虽然,不应该这样,因为并非所有单位都有复杂的。

在我看来,你应该让位置成为“根”。因此,Complex属于位置和单位属于复杂和位置。然后位置有一个/多个复杂的等等。或者只是将地址列放在单元/复杂表中。