【问题标题】:Another "need to pull data from two tables in cakephp"另一个“需要从 cakephp 中的两个表中提取数据”
【发布时间】:2012-08-26 02:52:07
【问题描述】:

好的,我有两个表,用户和单位。 'Unit' 属于'User',而'User' 有很多'Unit'。我想访问我的单位表中的所有数据,并将我的用户表中的一些数据附加到视图中。这是我的控制器代码:

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

我有两个模型,用户和单元,这是它们的代码: 来自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 ...
)

【问题讨论】:

  • 你的表结构是什么?
  • 我有一个用户表,其中包含大量信息,包括“user_id”字段。我有一个包含大量信息的单位表,包括“user_id”字段。我在我的控制器中再次更改了我的代码: public function condos() { $this->User->Unit->Behaviors->load('Containable'); $u=$this->User->Unit->find('all', array('conditions'=>array('Unit.type'=>'condo', 'Unit.active'=>1), '包含'=>array('User') )); $this->set('allcondos', $u);现在我得到了单位的数据,加上用户表的字段,但关联数组中的字段没有数据
  • 如果您忽略 containable 行为并在您的 find() 中指定 recursive 是否有效?
  • 我尝试先在 $this->User->Unit 上将其设置为 1,然后是 $this->User,然后是 $this->Unit,但它们都没有工作。
  • 请将debug( $allcondos ); 的输出发布到您的视图中。

标签: mysql cakephp cakephp-model


【解决方案1】:
$this->Unit->find('all', array(
        'conditions' => array(
            'type' => 'condo',
            'active' => 1,
        ),
        'contain' => array(
            'User',
        ),
    ));

使用containable获取相关数据。您也可以使用其中的条件来限制您想要的信息。

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

【讨论】:

  • 嗯,它仍然没有提取任何“用户”数据。好像我还缺少一些东西。
  • 我更改了我的控制器代码。 public function condos() { $this->User->Behaviors->load('Containable'); $u=$this->User->contain('Unit'); $u=$this->User->find('all'); $this->set('allcondos', $u);显然它没有将模型关联在一起,因为现在我得到了用户的所有数据,而不是单元的数据。
【解决方案2】:

如果没有您的数据库详细信息,很难准确说出发生了什么。但是,您似乎使用字符串值作为将 2 个模型链接在一起的外键。这是个坏主意。

我建议将 user_id fk 更改为引用 Users 表中 id 键列的 int 数据类型(好吧,假设 id 是一个自动递增的整数值)。

很难说这是否是确切的问题,但绝对值得一试,并且可以帮助您避免将来出现其他一些令人头疼的问题。

更新

如果您根据 Cake 约定来组织表格,那么大部分关联工作将为您完成。以下是我的做法:

用户表('users'):

id        primary key (int)

用户模型:

$hasMany = array( 'Unit' );

单位表('units'):

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

单元型号:

$belongsTo = array( 'User' );

如果您这样设置表格和模型,Cake 会自动将 units 表中的“user_id”与 users 表中的“id”关联起来。

【讨论】:

  • 你能解释一下为什么这是个坏主意吗?如果我有 x 个用户,每个用户可能有 x 个单位,我怎么能通过 id 匹配它们,因为它是自动递增的?我很困惑。我以为我应该在每个表中都有一个字段与另一个字段完全匹配?
  • @HeatherWalters 它给您带来了额外的维护负担。 id 已经是唯一的、自动递增的(具有默认值)并且很小。 user_id 作为 text/varchar 字段需要更多空间、仔细定义的约束等。如果您想更改 user_id 值,它还会导致大量更新负担(从而威胁您的数据库一致性)。最好有一个用户友好的user_id 字段用于仅用于显示目的,并将id 字段用于幕后的所有 fk 关联。
  • 那么,在我的两个 AppModel.php 文件中,我如何“建立关联”?如何说 User.id 与每个具有“someuser”的 user_id 的 Unit.id 相关联?
  • @HeatherWalters 与您对文本字段所做的方式相同。只需将字段名称更改为id 字段而不是user_id。而不是使用用户的文本表示,而是使用他们独特的id。如果您使用此命名约定,Cake 实际上会自动为您执行此操作。 book.cakephp.org/view/1039/…
  • 哇哦,成功了!!!!!!你摇滚,谢谢!我实际上在我的 User.php 文件中取出了“foreignKey=>'id',并删除了我的控制器和 BLAMMO 中的可包含功能。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
相关资源
最近更新 更多