2015-06-10 3 views
1

Я пытаюсь обновить таблицу данные пользователя, используя PHP ActiveRecord, но каждый раз, когда я получаю эту ошибкуНевозможно обновить PHP ActiveRecord: модель только для чтения

:: сохранить() не может быть вызвана из-за этой модели устанавливается только для чтения

я могу вставить в той же таблицы, но я не могу обновить

Details.php

<?php 
class Details extends ActiveRecord\Model 
{ 
public static $table_name='details'; 
public static $primary_key='id_user_detail'; 

public function before_create() 
{ 
    $this->date_created  = date("Y-m-d H:i:s"); 
    $this->date_modified  = date("Y-m-d H:i:s"); 
} 

public function before_update() 
{ 
    $this->date_modified = date("Y-m-d H:i:s"); 
} 

}?> 

профиль-edit.php

$sql = " select * from details where id_user_detail=1"; 
$user = Details::find_by_sql($sql); 
$user->user_fname="test"; 
$user->save(); 

Как я могу сделать обновление?

ответ

-1

Возможно, вы пытаетесь изменить атрибуты класса, прежде чем создавать экземпляр класса.

Подробности :: find_by_sql() должен возвращать новый экземпляр Details. Для примера:

public function find_by_sql($sql) { 
    //execute sql 
    if(some thing is returned) { 
     $details = new Details(); 
     $details->setByResult($sql_result) 

     return $details; 
    } 

    return null; 
} 
1

Тот факт, что это только для чтения, как ожидается. см. the manual for custom-sql finders

Это отобразит вашу модель как только для чтения, так что вы не сможете использовать какие-либо методы записи для возвращаемой модели (моделей).

Там нет необходимости использовать этот сложный искатель, просто использовать модель AR:

$user = Details::find(1); 
$user->user_fname="test"; 
$user->save(); 

Это работает, потому что id_user_detail является основным ключом. Если вы хотите найти на другом поле, позволяет сказать user_fname, сделайте следующее:

$user = Details::find_by_user_fname('test'); 
$user->user_fname="test2"; 
$user->save(); 

Читайте на тех искатели и о том, как использовать их, как вы должны избежать SQL-искателя.