运行 原始 sql 内部模型:Laravel
Running raw sql inside Model : Laravel
我正在使用 Laravel 并且需要 运行 来自 Model/Repository class
的原始 sql 查询
INSERT INTO calendar
(room_id, date, default_count, default_price)
VALUES ('1', '2017-01-02', '2', '400004')
ON DUPLICATE KEY UPDATE
default_count = VALUES(default_count), default_price = VALUES(default_price);
例如。当我从 UserRepository
插入数据时
$this->users->insert(['email' => 'john@example.com', 'votes' => 0]);
我需要某种方法来获得数据库连接和 运行 sql 通过模型
//Something like
$this->users->execute($sql);
我看到 Laravel 有 updateOrInsert()
方法,但我需要 运行 一次对多个数据集使用此方法。
如何通过模型 class 或存储库 运行 原始 sql 查询?
谢谢
已更新 - 已解决
我完成了 Eloquent Model Sourcecode 并发现我可以从 getConnection() 方法获得连接
$this->users->getConnection()->statement($sql);
这样做
$query = array(['room_id' => 1, 'date' => '2/1/2017', 'default_count' => '2', 'default_price' => '400004'],
['room_id' => 2, 'date' => '2/1/2017', 'default_count' => '3', 'default_price' => '455004']);
DB::table('calendar')->insart('query');
你也可以这样做,
创建模态对象并赋值
$obj_calendar = new Calendar();
$obj_calendar->room_id = 1;
$obj_calendar->date = date('Y-m-d H:i:s', strtotime('2017-01-02'));
$obj_calendar->default_count = 2;
$obj_calendar->default_price = 400004;
$obj_calendar->save();
使用交易
// 开始交易
public function beginTransaction()
{
DB::beginTransaction();
}
// 进行交易
public function makeTransaction($query)
{
DB::transaction(function($query) use($query)
{
DB::insert($query);
});
}
// 提交事务
public function commitTransaction()
{
return DB::commit();
}
用你的方法
public function insert($data)
{
$this->beginTransaction();
for($i=0; $i<count($data); $i++)
{
$name = $data[$i]->first_name, "middle_name" => $data[$i]->middle_name, "last_name" => $data[$i]->last_name;
$query = "INSERT INTO tbl_name(id, first_name, description, created_at, updated_at) VALUES (" . $data[$i]->id . ", " . $name . ", '" . $data[$i]->description . "', '" . date("Y-m-d H:i:s",strtotime($data[$i]->created_at)) . "', '" . date("Y-m-d H:i:s",strtotime($data[$i]->created_at)) . "'); ";
$scraper_service->makeTransaction($query);
}
//Add last commit
$this->commitTransaction();
}
我浏览了 Eloquent 模型源代码,发现我可以从 getConnection() 方法获得连接
$this->users->getConnection()->statement($sql);
不知道 statement() 是 运行 这个 sql 的最佳方式。然而它奏效了。
感谢大家的帮助。另外,如果您有更好的解决方案,请告诉我
我正在使用 Laravel 并且需要 运行 来自 Model/Repository class
的原始 sql 查询INSERT INTO calendar
(room_id, date, default_count, default_price)
VALUES ('1', '2017-01-02', '2', '400004')
ON DUPLICATE KEY UPDATE
default_count = VALUES(default_count), default_price = VALUES(default_price);
例如。当我从 UserRepository
插入数据时$this->users->insert(['email' => 'john@example.com', 'votes' => 0]);
我需要某种方法来获得数据库连接和 运行 sql 通过模型
//Something like
$this->users->execute($sql);
我看到 Laravel 有 updateOrInsert()
方法,但我需要 运行 一次对多个数据集使用此方法。
如何通过模型 class 或存储库 运行 原始 sql 查询?
谢谢
已更新 - 已解决
我完成了 Eloquent Model Sourcecode 并发现我可以从 getConnection() 方法获得连接
$this->users->getConnection()->statement($sql);
这样做
$query = array(['room_id' => 1, 'date' => '2/1/2017', 'default_count' => '2', 'default_price' => '400004'],
['room_id' => 2, 'date' => '2/1/2017', 'default_count' => '3', 'default_price' => '455004']);
DB::table('calendar')->insart('query');
你也可以这样做, 创建模态对象并赋值
$obj_calendar = new Calendar();
$obj_calendar->room_id = 1;
$obj_calendar->date = date('Y-m-d H:i:s', strtotime('2017-01-02'));
$obj_calendar->default_count = 2;
$obj_calendar->default_price = 400004;
$obj_calendar->save();
使用交易
// 开始交易
public function beginTransaction()
{
DB::beginTransaction();
}
// 进行交易
public function makeTransaction($query)
{
DB::transaction(function($query) use($query)
{
DB::insert($query);
});
}
// 提交事务
public function commitTransaction()
{
return DB::commit();
}
用你的方法
public function insert($data)
{
$this->beginTransaction();
for($i=0; $i<count($data); $i++)
{
$name = $data[$i]->first_name, "middle_name" => $data[$i]->middle_name, "last_name" => $data[$i]->last_name;
$query = "INSERT INTO tbl_name(id, first_name, description, created_at, updated_at) VALUES (" . $data[$i]->id . ", " . $name . ", '" . $data[$i]->description . "', '" . date("Y-m-d H:i:s",strtotime($data[$i]->created_at)) . "', '" . date("Y-m-d H:i:s",strtotime($data[$i]->created_at)) . "'); ";
$scraper_service->makeTransaction($query);
}
//Add last commit
$this->commitTransaction();
}
我浏览了 Eloquent 模型源代码,发现我可以从 getConnection() 方法获得连接
$this->users->getConnection()->statement($sql);
不知道 statement() 是 运行 这个 sql 的最佳方式。然而它奏效了。
感谢大家的帮助。另外,如果您有更好的解决方案,请告诉我