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已经加了

Laravel Model::push 使用疑问
确认在listener中和外部逻辑中是同一个对象id

spl_object_hash

《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案

示例代码没有写清楚,对 RelationModel 做了什么,如果只是关联了模型,但是没有对关联模型的属性进行修改的话,如一楼所说,不会执行SQL,这个用不用 Event 应该没啥关系。

4年前 评论
cevin (楼主) 4年前
讨论数量: 2

save的时候如果模型没有发生改变,是不会执行sql的!

4年前 评论
cevin (楼主) 4年前
Imuyu (作者) 4年前

示例代码没有写清楚,对 RelationModel 做了什么,如果只是关联了模型,但是没有对关联模型的属性进行修改的话,如一楼所说,不会执行SQL,这个用不用 Event 应该没啥关系。

4年前 评论
cevin (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!