2013-06-17 1 views
3

У меня возникли некоторые проблемы с функцией обновления PHP Laravel. Он не обновляется, а только вставляется.Laravel Eloquent не обновляет только вставку

public function post_rate(){ 
    $o = Input::all(); 

    //has user already rated?! 
    $query = DB::table("ratings")->select("id")->where("user", "=", Auth::user()->id)->where("story_id", "=", $o['story_id'])->get(); 
    foreach ($query as $d): 
     $theID = $d->id; 
    endforeach; 
    if (empty($query)): //User hasn't rated! 
      $z = new Rating(); 
    else: 
      $z = new Rating($theID); //user has rated, tell which to update 
-----------------------------^ that cause the problem! 
    endif; 

     $z->story_id = $o['story_id']; 
     $z->user = Auth::user()->id; 
     $z->rating = $o['rating']; 
     $z->save(); 

     echo "OK"; 

} 

Это работает, когда не было оснований строк, но когда я буду использовать новый рейтинг (@something), он терпит неудачу.

Идентификатор столбца в таблице «рейтинги» является основным и автоматическим.

В моей модели я также создал

public static $key = 'id'; 

Выход «$ theID» также содержит правильно идентификатор для тузда строки.

+0

Кусок советы -Если вы хотите получить массив, содержащий значения только из одного столбца, вы можете сделать это следующим образом: $ IdArray = DB :: таблицу («рейтинги») -> где («user», «=», Auth :: user() -> id) -> где ("story_id", "=", $ o ['story_id']) -> lists ('id'); – misaizdaleka

ответ

2

Try: $z = Rating::find($theID) с ->first() или ->get() вместо

+0

Не работает, :( –

+0

Это работает, извините !!! Большое спасибо –

+0

Пожалуйста, отметьте как разрешено, если это помогло –

2
$z = Rating::find($theID); 

или

$z = Rating::where('id', '=', $theID)->first(); 

Оба эквивалентны.

2

Для обновления в Laravel просто использовать команду

Rating::where('id','=',$theID)->update(array('name'=> $name)); 

Я надеюсь, что это может быть какой-то помощи.

2

Чувак!

Я принимал ту же проблему. Выбрав исходный код, я обнаружил, что правильным полем для установки имени первичного ключа является «primarykey».

Например:

class User extends Eloquent { 
    protected $table = 'users'; 
    protected $primaryKey = 'ID'; 
    public $timestamps = false; 
} 
0

Возьмите его легко!
взгляните на это, когда пользователь не оценил вас, просто сохраните его, как вы это делали раньше!

if (empty($query)){ //User hasn't rated! 
     $z = new Rating();  
     $z->story_id = $o['story_id']; 
     $z->user = Auth::user()->id; 
     $z->rating = $o['rating']; 
     $z->save(); 
} 

и в обновление части! сделайте следующее:

else{ 
    $rates = array(
       'story_id' => $o['story_id'], 
       'user' => Auth::user()->id, 
       'rating' => $o['rating'], 
      ); 
$old = Rating::find($theID); 
$old->fill($rates); 
$old->save(); 
} 
0

Для регистрации Красноречивый не работает обновление, так как метод я использовал (см ниже), не установить атрибут существует истину. Это связано с тем, что я получал все возвращаемые поля ($ request-> all) из запроса и создавал модель, но это не позволяет объекту обновляться.

Это не работает

$produto = new Produto($request->all()); 
$produto->update(); 

Это также не работает

$produto = new Produto($request->all()); 

$produtoToUpdate = Produto::find($this->id); 
$produtoToUpdate->update(get_object_vars($produto)); 

Никогда не используйте get_object_var, Красноречивым Модель имеет виртуальный атрибут (вы получаете с GetAttributes) , поэтому get_object_var сделал не возвращать поля.

Эта работа !!

$produto = new Produto($request->all()); 

if ($this->id <= 0) 
{ 
    $produto->save(); 
} else 
{ 
    $produto->exists = true; 
    $produto->id = $this->id; 
    $produto->update(); 
} 
Смежные вопросы