Laravel Model::push 使用疑问
其实应该是对象作用域或生命周期的疑问
场景这样的,直接上代码
// model
class SomeModel extends Model
{
protected $dispatchesEvents = [
'updated' => EventName::class,
];
public function relationName() {# 确认这个没问题能关联上能读取
return $this->belongsTo('relation', .....);
}
}
// event:
class EventName {
public $model;
public function __construct(SomeModel $model) {
$this->model = $model;
}
}
// listener
class ListenerName {
public function handle(EventName $event) {
$event->model->status = 'FAIL';## 注意 如果SomeModel发生变化会触发EventName的事件
}
}
## 问题来了
## laravel 6 以后支持了一个 $model->push() 的方法 是这么定义的
public function push()
{
if (! $this->save()) return false;
foreach ($this->relations as $models) {
$models = $models instanceof Collection
? $models->all() : [$models];
foreach (array_filter($models) as $model) {
if (! $model->push()) return false;
}
}
return true;
}
# 当写了一个testcommand的时候
$model = SomeModel::with('relationName')->find($pk);
//$model->relationName;// 有值
$model->status = 'FAIL';
$model->push();
// 理论上说relation关联的字段应该被修改的 但是看sql执行记录并没有执行
// 追踪了一下执行也没发现什么问题
// 开始怀疑是不是是不是事件发生时会重新弄一个新对象?然后再继续传递?
// EventSeviceProvider已经加了
确认在listener中和外部逻辑中是同一个对象id
spl_object_hash
示例代码没有写清楚,对 RelationModel 做了什么,如果只是关联了模型,但是没有对关联模型的属性进行修改的话,如一楼所说,不会执行SQL,这个用不用 Event 应该没啥关系。