cakephp hasAndBelongsToMany

时间:2018-01-19 19:37:10

标签: cakephp associations

我的预订'模特和'简介' model有hasAndBelongsToMany关联。

这是我的预订模式。

 class Reservation extends AppModel {
   .
   .
   var $hasAndBelongsToMany = array(
    'Profile' => array(
        'className' => 'Profile',
        'joinTable' => 'profiles_reservations',
        'foreignKey' => 'reservation_id',
        'associationForeignKey' => 'profile_id',
        'unique' => true,
    )
);

这是我的个人资料模型。

class Profile extends AppModel  {
     var $name = 'Profile';
}

这是我的控制器。

 function prac3($lname, $fname) {
    $profiles = $this->Profile->find('all', array(
            'conditions' => array(
                    'Profile.lname LIKE' => $lname.'%',
                    'Profile.fname LIKE' => '%'.$fname.'%'
            ),
            'order'=>array( 'Profile.created DESC' ),
    ));
    $this->set('profiles', $profiles);
 }

这是我的观点。

 <?php
if($profiles) {
    foreach($profiles as $key => $profile): ?>
    <tr>
        <td><?= $profile['Profile']['id'] ?></td>
        <td><?= $profile['Profile']['lname'] ?></td>
        <td><?= $profile['Profile']['fname'] ?></td>
        <td><?= $profile['Profile']['home_phone'] ?></td>
    </tr>
    endforeach;
    echo '</table>';
}
?>

我希望使用个人资料模型在视图中获得[&#39;预订&#39;] [&#39; name&#39;]。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

更新您的个人资料类

    class Profile extends AppModel  {
         var $name = 'Profile';

         var $hasAndBelongsToMany = array(
             'Reservation' => array(
                 'className' => 'Reservation',
                 'joinTable' => 'profiles_reservations',
                 'foreignKey' => 'profile_id',
                 'associationForeignKey' => 'reservation_id',
                 'unique' => true, // More about update below
         )
    }

在你的find()方法中,请使用递归:

$profiles = $this->Profile->find('all', array(
        //...
        'recursive' => 2,
));

或包含行为:

$this->Profile->Behaviors->load('Containable');  

$profiles = $this->Profile->find('all', array(
        //...
        'contain' => array(
                'Reservation',
        ),
        'recursive' => -1,
));

并且您的保留将在$profiles['Reservation'][n]['name']

之类的数组中

另外,在您的评论中您写了“当我添加新的预订和个人资料时,具有个人资料ID的行在profiles_reservations表中消失了。
因为您在'unique' => true属性中使用$hasAndBelongsToMany。食谱说:

  

如果为true(默认值),CakePHP将在插入新密钥之前首先删除外键表中的现有关系记录。更新时需要再次传递现有关联。

请参阅:https://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm

答案 1 :(得分:0)

试试这个

class ReservationsTable extends Table
{
    public function initialize(array $config)
    {
        $this->belongsToMany('Profiles', [
            'joinTable' => 'reservation_profiles',
        ]);
    }
}
class ProfilesTable extends Table
{
    public function initialize(array $config)
    {
        $this->belongsToMany('Reservations', [
            'joinTable' => 'reservation_profiles',
        ]);
    }
}

然后,正如您所看到的,ReservationsTable是使用reservation_profiles表将预留与配置文件相关联的模型,以便配置文件执行相同操作。您不需要为reservation_profiles建立模型,但是您必须在数据库中使用此表,我会使用迁移来创建它们。最后在您的控制器中,这可以在您调用的ReservationController中

$this->Reservation->Profiles->find()->where(['condition'=> 'param']);

这可以解决你的问题,解释($ this)参考Controller类, - &gt; REERV参考模型预约 - &gt;配置文件引用类预订模型的相关模型, - &gt; find()...引用执行的查询。如果您需要更多https://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations