attach()和detach()不更新模型

时间:2014-10-22 18:33:53

标签: php laravel laravel-4

基本上,我正在进行ajax调用,要求Controller添加一定数量的" Artigo" (这意味着产品)到Actividade(这是一种文件)。

他们有多对多的关系。

行为应如下:

  • 如果" Actividade"没有" Artigo",它应该附加它并在数据透视表中设置数量;
  • 如果" Actividade"有它和现有数量与输入数量相加是:
    • 零以上,简单地总结一下;
    • 零以下,忽略它;
    • 完全为零,分离它;
  • 在所有情况下,控制器应返回更新的" Artigo"附于" Actividade"。

以下代码完美无缺,但它会运行额外的查询以获取更新的" Artigo"在返回JSON之前。

// Controller

public function ajaxAddArtigo() {
    if(Request::ajax()) {
        try {
            $actividade = Actividade::find(Input::get('actividadeId')); // Actividade is something like a "Document"
            $artigo = Artigo::find(Input::get('artigoId')); // Artigo is a product
            $actividade->addArtigo($artigo, intval(Input::get('qtd'))); // "qtd" is quantity

            // if quantity of the Artigo becomes 0, the Artigo is detached and this doesn't return the updated collection (with the Artigo now detached)
            // if the Artigo doesn't exist and quantity is a positive value, the Artigo gets attached, but this still doesn't return the updated collection (with the new Artigo attached)
            return Response::json($actividade->artigos);

            //return Response::json(Actividade::find(Input::get('actividadeId'))->artigos); // i must do this to return the updated list :(
        } catch (Exception $ex) {
        }
    }
}


// Model Actividade

public function addArtigo(Artigo $artigo, $quantidade = 1) {
    if($this->auth() || $this->authColab()) {
        $actArtigo = $this->artigos->first(function($i, $item) use($artigo) { // get the wanted Artigo from the related Artigo's (or not, if it doesn't exist)
            return $item->id == $artigo->id;
        });

        if(count($actArtigo)) { // if it exists
            if($actArtigo->pivot->quantidade + $quantidade >= 0) { // we will see the effect of summing the quantity (it can be a negative number)
                if($actArtigo->pivot->quantidade + $quantidade == 0) { // if it becomes 0, detach it
                    $this->artigos()->detach($artigo->id);
                } else { // if it becomes bigger than 0, just sum it
                    $actArtigo->pivot->quantidade += $quantidade;
                }
            }
        } else { // if it doesn't exist, add a new one as long as quantity is a cool value
            if($quantidade > 0) {
                return $this->artigos()->attach($artigo, [
                    'utilizador_id' => Auth::user()->id,
                    'quantidade' => $quantidade
                ]);
            }
        }
    }
}

有没有办法让Laravel在执行attach()detach()时更新模型?

1 个答案:

答案 0 :(得分:-1)

连接或分离后,请确保使用save()方法保存模型

否则任何更改或关系都将丢失