1

到目前为止,我的数据库中设置了 3 个表:

用户 / User_Profiles / 地址

地址表用于存储来自用户以及最终来自公司等的未来地址。User_Profiles 表包含有关不涉及地址的用户的更多信息。

Users Table:

id | username | password | etc....


User_Profiles:

id | user_id | phone | website | bio | address_id | shipping_address_id


Addresses

id | address | city | state | zip | etc...

这是我的问题。我想通过 id 找到一个用户,然后返回他的所有信息——他来自 user_profiles 的信息和他来自地址的信息(address_id 和 shipping_address_id 都指向地址表)。

在我的模型中,我目前有这个:

 public function getUserInfo($user_id){

     return $this->find()
        ->contain(['user_profiles'=>['fields'=>['user_id','phone_number', 'website', 'bio', ]]])
        ->where(['id' => $user_id])
        ->first();
 }

这很简单,并返回我的 user_profile 信息。现在我需要加入地址表(我猜是两次?)以获取送货地址和常规地址(通过 shipping_address_id 和 address_id)。

我怎样才能做到这一点?我想我可以使用 TableRegistry 加载 user_profiles 表以将 address_id 和 shipping_address_id 存储为变量,然后从那里开始工作,但这似乎过于复杂。

理想情况下,我希望在一个对象中返回所有信息 - user_profile 信息以及任何关联的地址。

4

2 回答 2

1

第一件事

你需要告诉 Cake 你的表是如何相互关联的。
在您的UsersTable.php文件中,添加以下方法:

public function initialize(array $config)
    $this->hasOne('UserProfiles');
}

现在,当您从 Users 表中检索某些内容时,Cake 知道如何在 UserProfiles 表中查找信息。只要您遵循约定,这对于简单的关联就足够了。

现在在您的UserProfilesTable.php文件中,我们可以定义稍微复杂一些的关联。

public function initialize(array $config)

    $this->belongsTo('Users');

    $this->belongsTo('Address', [
        'className' => 'Addresses',
        'foreignKey' => 'address_id',
        'property_name' => 'address'
    ]);

    $this->belongsTo('ShippingAddress', [
        'className' => 'Addresses',
        'foreignKey' => 'shipping_address_id',
        'property_name' => 'shipping_address'
    ]);
}

第一个关联非常简单。它告诉 Cake UserProfiles 表指向 Users 表中的一条记录。
只要你遵守约定,这里应该没有问题。

接下来的两个协会需要更多的工作。
由于您需要将 UserProfiles 与 Addresses 关联两次,因此您必须为每个关联定义一个别名。此别名将在 contains 方法中识别您的关联。

这应该足以让您的 find 方法按预期工作。

您可以在本书的这一部分了解更多关于关联的信息。

检索您的数据

public function getUserInfo($user_id){
    return $this->find()
        ->contain([
            'UserProfiles', 'UserProfiles.Address', 'UserProfiles.ShippingAddress'
        ])
        ->where(['id' => $user_id])
        ->first();
}

现在所有关于用户、用户配置文件、地址和运输地址的信息将只使用 find 方法检索一次。
您还可以将参数和定义条件传递给每个关联,如本书这一部分中所述

希望这可以帮助一些将来面临同样问题的人。

于 2014-12-21T19:16:42.667 回答
0

使用

$hasOne
$hasMany

CakePHP 模型中的属性

http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html

如果您遵循 CakePHP 名称约定,您应该能够通过编写 3 行代码来对这些关系进行建模。

于 2014-09-18T16:54:26.333 回答