我的预订'模特和'简介' 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;]。我怎样才能做到这一点?
答案 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将在插入新密钥之前首先删除外键表中的现有关系记录。更新时需要再次传递现有关联。
答案 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