我有一张"门票"用于创建错误报告系统的表。此票证的enum
status
列可以是open
,close
或solved
。
不是打开/关闭/解决控制器内的票证,我只是想在模型中做到这一点;即我希望有一个名为open()
,close()
和solved()
的函数,以便我可以Ticket::find($id)->close();
。这应该将属性status
设置为close
,然后保存它!
最好的方法是什么?此外,这会被视为不良做法吗?我应该在控制器内执行此操作吗?
我尝试过这样做,但没有成功:
public function close()
{
$this->status = 'close';
// Also tried $this->attributes['status'] = 'close';
$this->save();
}
答案 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
干杯。