简单来说是这样的,有两个表,一个user,一个address, 一个用户可能会有多个地址
user 表是结构

namespace Common\Model;
use Think\Model\RelationModel;
class UserModel extends RelationModel {
protected $_link = array(
'address' => array(
'mapping_type' => self::HAS_MANY,
// 'class_name' => 'Address',
'foreign_key' => 'user_id',
'mapping_name' => 'address',
'mapping_order' => 'id desc',
),
);address表的结构
然后在控制器里面我这样写的
$user = D('User');
$data = $user->relation('address')->find('#用户ID#'); //用户ID就是user表其中一个用户的id,这样$data数组会得到正确的信息,就是用户user的资料加行这个用户的所有address信息,查询这步是没有问题了。然后我开始测试针对这个用户写入新的地址和做一下更新其中一条地址信息
$newAddress = array();
$newAddress['address'] => array(
array( id=>'100', name => '更新后的新名字', phone => '更新后的新电话' ), // 只更新地址表address主键id为100的那条信息
array( 'user_id' => '#用户ID#', 'name' => 'xxx', 'phone' => '123456', 'city'=>'GZ','province'=>'GD','postcode'=>'123456','street'=>'XXXXX','country'=>'XX' ),
);
$user->relation("address")->save($newAddress);执行上面的代码,无任何反应,查看Think\Model.class.php代码436行function save()里面: if(!isset($where)){
// 如果没有任何更新条件则不执行
$this->error = L('_OPERATION_WRONG_');
return false;
}else{
$options['where'] = $where;
}上面说如果没有where条件就返回false? 所以save这步根本就没有执行完就弹回false了,好吧,那我把代码变成这样,加一个where$user->relation("address")->where('1=1')->save($newAddress);然后就出现错误代码了SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE ( 1=1 )' at line 1
接着我在where测试了各种条件比如where('id=#用户ID#'),都是弹出上面的SQLSTATE[42000]错误,这是什么情况?我的MYSQL有问题?
下面我测试了删除用户的地址
$user->relation("address")->delete('#用户ID#');现在有两个问题:1. 执行上面这个时候,TP执行两条SQL
D ELETE FROM `address` WHERE `user_id` = #用户ID#
D ELETE FROM `user` WHERE `id` = #用户ID#这个为什么会这样?删除了对应用户ID的地址然后在user表里面直接把用户一起删除了?这是一个bug?还是我没有写对代码?还有就是我想实现删除address中用户的特定一条记录,这段代码怎么写?请用RelationModel实例实现。
最佳答案