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

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
最佳答案

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

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

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

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

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

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

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