我想我错过了一些东西,因为这是显而易见的,我无法想象它真的有这样的方式:
class ApiUser extends CActiveRecord {HAS_MANY ApiLog}
class ApiLog extends CActiveRecord {BELONGS_TO ApiUser}
现在我想保存一个新的ApiLog记录:
class ApiLog:
/**
* Logs a call to the API
*
* @param type $apiUser
* @param type $apiCall
* @param type $executionTime
* @param type $resultCount
* @param type $message
*/
public static function Log($apiUser, $apiCall, $executionTime = null, $resultCount = null, $message = '') {
$log = new ApiLog();
$log->apiUser = $apiUser;
$log->apiCall = $apiCall;
$log->clientIp = $_SERVER['REMOTE_ADDR'];
$log->executiontime = $executionTime;
$log->resultCount = $resultCount;
$log->logText = $message;
$log->save(false);
}
但是这行发生了异常: $对数>保存(假);
CDbCommand无法执行SQL语句:SQLSTATE [23000]: 完整性约束违规:1452无法添加或更新子行: 外键约束失败
预期行为:$log->apiUser = $apiUser;
设置$log->apiuser_id
属性。如果我手动执行此操作($log->apiuser_id = $apiUser->id
)没问题,它会相应地保存对象。
class CActiveRecord
/**
* PHP setter magic method.
* This method is overridden so that AR attributes can be accessed like properties.
* @param string $name property name
* @param mixed $value property value
*/
public function __set($name,$value)
{
if($this->setAttribute($name,$value)===false)
{
if(isset($this->getMetaData()->relations[$name]))
$this->_related[$name]=$value;
else
parent::__set($name,$value);
}
}
为什么它存储对相关对象的引用,但不会相应地更新外键属性?构建insertquery的sql命令构建器也不识别相关对象/外键东西>
CActiveRecord
// ... //
public function insert($attributes=null) {
// ... //
$builder=$this->getCommandBuilder();
$table=$this->getMetaData()->tableSchema;
$command=$builder->createInsertCommand($table,$this->getAttributes($attributes));
if($command->execute()) {
它刚刚传递了属性数组,该数组不包含集合相关对象,只是记录属性(包含$apiuser_id
)但不从相关对象中检索外来id。
我的问题:我在这里错过了什么......
答案 0 :(得分:0)
没有遗漏任何东西。这就是它的工作方式。您必须直接设置属性,而不是通过关系隐式设置。