Laravel Eloquent - 在模型中设置列

时间:2014-09-19 20:48:12

标签: laravel laravel-4 eloquent

我有一张"门票"用于创建错误报告系统的表。此票证的enum status列可以是openclosesolved

不是打开/关闭/解决控制器内的票证,我只是想在模型中做到这一点;即我希望有一个名为open()close()solved()的函数,以便我可以Ticket::find($id)->close();。这应该将属性status设置为close,然后保存它!

最好的方法是什么?此外,这会被视为不良做法吗?我应该在控制器内执行此操作吗?

我尝试过这样做,但没有成功:

public function close()
{
   $this->status = 'close';
   // Also tried $this->attributes['status'] = 'close';
   $this->save();
}

3 个答案:

答案 0 :(得分:5)

将IMO放入模型中是完美的选择。

class Ticket extends Eloquent {
  public function open() {
    $this->status = 'open';
    $this->save();
  }
}

答案 1 :(得分:2)

在我看来,这比直接从controller执行此更好的方式,您可以使用scopeMethod,例如:

function scopeClose($query)
{
    // Close the ticket and return $query;
    return $query->where('...');
}

如果您返回$query,那么您可以进行方法链接。例如:

Ticket::find($id)->close()->otherMethodCall();

如果您执行query例如$query->update('...'),则返回$query将没有任何意义,因为它将是update方法的结果,是true/false

使用scope方法的好处是:

// In your model
function scopeClose($query, $id)
{
    $model = $query->find($id);
    $model->status = 'whatever';
    $model->save();
    return true; // Or just return $model->save();
}

因此,您可以在controller中使用

Ticket::close(10); // Update the status of record with id 10

答案 2 :(得分:1)

另一种方法是使用"C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x64\signtool.exe"函数,但在此之前,您必须确保要更新的列确实位于update()数组中。

$fillable

干杯。