dato che dopo la copia devo salvare il record, NON posso ovviamente portarmi a dietro come safe l’attributo id.
La domanda rimane: come mai cerca di settare anche l’id durante l’attribuzione massiva dei valori ?
Questo è il codice della setAttributes, che viene eseguito automaticamente usandola come
$model->attributes = $altro_model->attributes;
Guida ufficiale
public function setAttributes($values,$safeOnly=true)
{
if(!is_array($values))
return;
$attributes=array_flip($safeOnly ? $this->getSafeAttributeNames() : $this->attributeNames());
foreach($values as $name=>$value)
{
if(isset($attributes[$name]))
$this->$name=$value;
elseif($safeOnly)
$this->onUnsafeAttribute($name,$value);
}
}
quello che segue invece è il codice della getSafeAttributeNames
public function getSafeAttributeNames()
{
$attributes=array();
$unsafe=array();
foreach($this->getValidators() as $validator)
{
if(!$validator->safe)
{
foreach($validator->attributes as $name)
$unsafe[]=$name;
}
else
{
foreach($validator->attributes as $name)
$attributes[$name]=true;
}
}
foreach($unsafe as $name)
unset($attributes[$name]);
return array_keys($attributes);
}
Da questo capisco il problema è semplicemente che nell’espressione
$model_a->attributes = $model_b->attributes
nella parte DESTRA dell’espressione,tra gli attributes, c’è già anche ‘id’, cosa che non mi aspettavo.
Quindi facendo il ciclo tra tutti gli attributes di B da settare in A, trova id, vede che non è safe, quindi segnala il warning (e non lo setta, come corretto e come voluto).