36 php laravel eloquent laravel-4
我在Laravel 4上遇到了一个小问题.我想delete()在记录上使用该方法,但由于某种原因它实际上并没有删除记录.destroy()但是,所以我的代码很好.另外,如果我Teetime::where('date', '=', $formattedDate)->count()转到我的视图,我会得到一个正确的.有什么问题?
if($action=="delete") {
$teetime = Teetime::where('date', '=', $formattedDate)->firstOrFail();
// for some reason $teetime->delete() doesn't work
Teetime::destroy($teetime->id);
}
Run Code Online (Sandbox Code Playgroud)
pho*_*ops 58
destroy 是直接删除实体的正确方法(通过对象或模型).例:
$teetime = Teetime::where('date', '=', $formattedDate)->firstOrFail();
$teetime->destroy();
Run Code Online (Sandbox Code Playgroud)
delete 只能在查询生成器中调用例:
$teetime = Teetime::where('date', '=', $formattedDate)->delete();
Run Code Online (Sandbox Code Playgroud)
来自文档:
User::destroy(1);
User::destroy(array(1, 2, 3));
User::destroy(1, 2, 3);
Run Code Online (Sandbox Code Playgroud)
当然,您也可以在一组模型上运行删除查询:
$affectedRows = User::where('votes', '>', 100)->delete();
Run Code Online (Sandbox Code Playgroud)
更多信息:http://laravel.com/docs/eloquent
2014 年接受的答案可能是正确的,我不确定。现在肯定是不正确的。
delete()针对模型类的实例调用该方法。使用原始问题的代码:
$teetime = Teetime::where('date', '=', $formattedDate)->firstOrFail();
// $teetime is a model instance
$teetime->delete();
Run Code Online (Sandbox Code Playgroud)
该destroy()方法是模型类的静态方法。它接受一个或多个主键:
$teetime_ids = Teetime::where('date', '=', $formattedDate)->pluck('id');
// $teetime_ids is a collection of 1 or more primary keys
Teetime::destroy($teetime_ids);
Run Code Online (Sandbox Code Playgroud)
从文档中:
删除模型
要删除模型,您可以在模型实例上调用delete方法:
Run Code Online (Sandbox Code Playgroud)$teetime_ids = Teetime::where('date', '=', $formattedDate)->pluck('id'); // $teetime_ids is a collection of 1 or more primary keys Teetime::destroy($teetime_ids);通过主键删除现有模型
在上面的示例中,我们在调用方法之前从数据库中检索模型
delete。但是,如果您知道模型的主键,则可以删除模型,而无需通过调用该destroy方法显式检索它。除了接受单个主键之外,该destroy方法还将接受多个主键、主键数组或主键集合:Run Code Online (Sandbox Code Playgroud)use App\Models\Flight; $flight = Flight::find(1); $flight->delete();
还有一个delete()查询生成器方法,允许您直接从数据库表中删除记录。使用此方法有一些重要的注意事项,并且重要的是要了解 Eloquent 实现自己的查询构建器类,就像它实现自己的集合类一样。
当针对Eloquent 查询构建器调用时,会保留某些行为,例如对软删除的支持。但是,Eloquent 事件deleting和deleted不会被触发,因为模型从未创建。
delete()也可以针对基本查询构建器类进行调用,该类根本不了解 Eloquent。
比较生成的查询,假设Teetime导入SoftDeletes特征:
Flight::destroy(1);
Flight::destroy(1, 2, 3);
Flight::destroy([1, 2, 3]);
Flight::destroy(collect([1, 2, 3]));
Run Code Online (Sandbox Code Playgroud)
Teetime::where('date', '=', $formattedDate)->delete();
// UPDATE teetimes SET deleted_at = NOW(), updated_at = NOW() WHERE `date` = ?
Run Code Online (Sandbox Code Playgroud)
我想知道有多少种解释。这种差异实际上很容易解释。
您有两种删除实体的方法:
$model->delete()和Model::destroy($model->id)。第一个选项直接指模型。这意味着您必须已经拥有它。例如,对于 RouteModelBinding 就是这种情况,您可以直接在控制器中删除实体。
public function destroy(SomeModel $model)
{
return $model->delete();
}
Run Code Online (Sandbox Code Playgroud)
这里的返回值delete()是一个布尔值。
第二个选项不预设实体。您只需要型号。然后将所需实体的 id 作为参数传递。
public function destroy($id)
{
return SomeModel::destroy($id);
}
Run Code Online (Sandbox Code Playgroud)
这里的返回值destroy()是一个整数。该数字告诉您有多少实体被删除。在该示例中,逻辑上它仅为 1。