我无法编写代码来获取另一个函数的对象。
我有一个叫RepairsService
的课,我有两个功能。
首先createRepair($request, $vehicle)
是我创建对象的地方。
public function createRepair($request, $vehicle)
{
DB::transaction(function () use ($request, $vehicle) {
Log::info('Creating new repair.');
$repair = new Repair();
$repair->vehicle_id = $vehicle->id;
DB::insert('insert into repairs (vehicle_id) values (?)',
[$repair->vehicle_id]);
});
$this->addRepair($request, $vehicle, $this); //here I call second function trying to pass $this parameter as object
}
在同一个班级中排名第二
public function addRepair($request, $vehicle, $repair){
DB::transaction(function () use ($request, $vehicle, $repair) {
$workers_needed->repair_id = $repair->id; //I need to get this id from the object
$workers_needed->worker_id = $request->worker_id;
DB::insert('insert into repair_worker (repair_id, worker_id) values (?, ?)',
[$workers_needed->repair_id, $workers_needed->worker_id]);
Log::info('Repair created.');
flash('Repair successfully added.', 'success');
});
}
我做错了什么?现在使用此代码,我收到错误
Undefined property: App\Models\Repairs\RepairsService::$id
什么是有意义的,因为我没有传递对象(我认为)。
更新
因此上面描述的主要问题在以下代码中得到修复,但我现在正处于一个非常小的问题。在第二个函数中,我尝试将$repair-id
分配给$workers_needed->repair_id
但我在那里得到NULL
值。我试图分配值1
(硬编码)而不是使用$repair-id
,但似乎我的第二个函数调用在第一个函数完成transaction
之前运行是有意义的,因为as据我所知,transaction
仅在一切顺利时插入数据,在这种情况下,它正在等待第二个函数完成其工作。因此repair
实例未插入数据库。如何编辑代码以便事务完成然后我调用我的第二个函数?或者还有另一种方法可以做到吗?
public function createRepair($request, $vehicle)
{
$repair = null;
DB::transaction(function () use ($request, $vehicle, $repair) {
Log::info('Creating new repair.');
$repair = new Repair();
$repair->vehicle_id = $vehicle->id;
DB::insert('insert into repairs (vehicle_id) values (?)',
[$repair->vehicle_id]);
$this->addRepairWorker($request, $vehicle, $repair);
});
}
public function addRepairWorker(Request $request , Vehicle $vehicle, Repair $repair){
$workers_needed = null;
DB::transaction(function () use ($request, $vehicle, $repair) {
Log::info('Creating new repair worker instance.');
$workers_needed = new Repair_worker();
$workers_needed->repair_id = $repair->id;
$workers_needed->worker_id = $request->worker_id;
DB::insert('insert into repair_worker (repair_id, worker_id) values (?, ?)',
[$workers_needed->repair_id, $workers_needed->worker_id]);
Log::info('Repair created.');
flash('Repair successfully added.', 'success');
});
}
答案 0 :(得分:1)
不应该;
public function createRepair($request, $vehicle)
{
$repair = null;
DB::transaction(function () use ($request, $vehicle, $repair) {
Log::info('Creating new repair.');
$repair = new Repair();
$repair->vehicle_id = $vehicle->id;
DB::insert('insert into repairs (vehicle_id) values (?)',
[$repair->vehicle_id]);
});
$this->addRepair($request, $vehicle, $repair);
}
这是因为您希望该函数调用中有repair
个实例。
此外,您正在使用匿名函数,因此您必须在范围之外声明repair
并使用use
为函数声明它。
<强>更新强>
为了适应新的错误,您需要commit()
该事务才能更新/插入。可以找到更多信息here。
DB::transaction(...);
DB::commit(); // This is where the query actually gets sent to the database
在滚动自己的DB
包装器时,您可能必须自己编写方法,下面是使用PDO
的示例;
class DB {
...
public function commit() {
return $PDO->commit();
}
...
}
提交会在成功/失败时返回bool
,以便您可以在false
时回滚,或在true
时继续。
答案 1 :(得分:0)
在班级RepairsService
的第一个方法中,你可以这样调用你的第二个方法:
$this->addRepair($request, $vehicle, $this);
$this
是RepairsService
的一个实例,但在您的第二种方法中,您似乎期望有一个类Repair
的对象。
所以你应该使用刚刚在第一种方法中实例化的对象来调用第二种方法:
$this->addRepair($request, $vehicle, $repair);
通常,添加type-hinting会很有用,这样您就可以直接捕获这些错误。你的第二种方法可能就像:
public function addRepair(Request $request, Vehicle $vehicle, Repair $repair){
...
假设我的班级名称正确......
现在你的IDE应该在你运行代码之前告诉你你做错了什么。
编辑:请注意,如果您想使用类型提示(您应该......),则需要使用正确的类。
所以在你的情况下,很可能是这样的:
public function addRepair(\Illuminate\Http\Request $request, Vehicle $vehicle, Repair $repair){
...
但最终它取决于你想要传递的对象以及它们所属的类。