我在使用Laravel SQL Builder时遇到了一些麻烦。我要删除第一行。我正在使用以下代码:
DB::table('ahah')->first()->delete().
在控制器中,我已经使用语句DB
导入了use Illuminate\Support\Facades\DB
类。您能告诉我什么问题以及如何解决吗?
答案 0 :(得分:4)
它不起作用,因为DB::table('ahah')->first()
返回一个stdClass
对象。当然,stdClass
没有delete()
方法。
因此,您将需要使用SQL语句获取表的第一项:
// Supposing your primary key column is called 'id'
DB::table('ahah')
->orderBy('id')
->limit(1)
->delete();
答案 1 :(得分:1)
如果在Laravel中工作,那么最好通过创建模型来使用雄辩的ORM 。
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
// Code Stuff
}
获取第一条记录并删除
$user = \App\Models\User::orderBy('id')->first()->delete();
答案 2 :(得分:0)
ModelName:根据您的模型进行更改
$item = ModelName::orderBy('id', 'ASC')->first();
$item->delete();
答案 3 :(得分:0)
正如其他人回答的那样,应该按照您的问题中的描述满足您的要求。
我只是添加了一种更清洁的技术来删除表的第一行。创建模型(使用Eloquent制作),然后添加一个范围方法,该方法将返回表的第一行,然后您只需要在查询生成器上调用delete()
。
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class FooBarModel extends Model
{
protected $table = 'foo_bar';
/**
* Scope a query to retrieve first row.
*
* @param \Illuminate\Database\Eloquent\Builder $query
* @return \Illuminate\Database\Eloquent\Builder
*/
public function scopeFirstRow($query)
{
return $query->orderBy('id')->first(); // Assuming id is the name of primary key column in the table
}
}
然后,您可以将第一行删除为:
FooBarModel::firstRow()->delete(); // This will delete the very first available row every time it is called
但是,处理异常始终是一种好习惯。在这里,如果表中没有行,则调用上面的语句将引发异常,因为查询生成器对象将返回null
。因此最好先检查结果是否不为null,然后仅调用delete()
方法。
$firstRow = FooBarModel::firstRow();
if (!is_null($firstRow)) {
$firstRow->delete();
}
类似地,您也可以创建其他作用域以删除最后一行,最后到最后一行,等等。
如果您想采用一种比此方法更简洁的方法,则只需在Model
本身中编写一个方法,然后编写所有要删除的代码即可。
/**
* @return bool
*/
public static function deleteFirstRow()
{
$firstRow = self::firstRow();
if (!is_null($firstRow)) {
$firstRow->delete();
return true;
}
return false;
}
然后调用deleteFirstRow()
删除第一行。
FooBarModel::deleteFirstRow();
希望这会有所帮助。
答案 4 :(得分:0)
使用最早的方法获取第一条记录:
$ahah_first = \DB::table('ahah')->oldest()->first();
\DB::table('ahah')->where('id', $ahah_first->id)->delete();