Laravel 5.4关系未在模型启动方法中加载

时间:2017-11-08 12:11:04

标签: php laravel laravel-5.4

我有一个名为' Poll'的模特。在民意调查模型中,我定义了一个如下的启动方法:

namespace App\Events;

use App\Models\Poll;
use Illuminate\Queue\SerializesModels;

class PollCreated
{
  use SerializesModels;

  public $poll;

  /**
   * Create a new event instance.
   *
   * @param  Poll  $poll
   * @return void
   */
  public function __construct(Poll $poll)
  {
      // $this->poll = $poll;
      $event = $poll->event()->first();
      // dd($event);
      // dd($poll->speakers()->get());
      // dd($poll->load('speakers'));
  }
}

我正在添加扬声器关系,它工作正常。

但是在这个启动方法中,如果我试图获得扬声器关系,则在self :: created内部,它总是空的(dd($ speakers)行)。是不是因为引导方法在模型保存到DB后才运行,并且关系根本没有保存?

我在代码中提到的dd($ model)中获得了新创建的模型。

更新

我也尝试过活动。 我的民意调查模式:

    <?php

    namespace App\Models;

    use Illuminate\Database\Eloquent\Model;
    use Backpack\CRUD\CrudTrait;

    class Speaker extends Model
    {
    use CrudTrait;
    ……..

        public function polls()
        {
            return $this->belongsToMany('App\Models\Poll');
        }
    ……..
    }

应用/活动/ PollCreated.php:

{{1}}

这里我也没有收到发言者的话:dd($ poll-&gt; speakers() - &gt; get());

我的演讲者模特:

{{1}}

1 个答案:

答案 0 :(得分:0)

问题在于时序,因为必须始终创建模型才能将它们设置为多对多关系。因此,不可能在created事件中进行多对多关系的情况下,已将关系设置为created事件,总是在关系之前引发该事件。

任何寻求解决方案的人都可以尝试使用chelout/laravel-relationship-events软件包,因为这会将关系事件添加到模型中。

可以肯定的是,我使用用户和计算机的简单应用程序对此进行了测试。

User.php

class User extends Model
{
    use HasBelongsToManyEvents;

    public static function boot() {
        parent::boot();

        self::created(function($model){
           Log::info('user::created');
        });

        static::belongsToManyAttaching(function ($relation, $parent, $ids) {
            $ids = implode(' & ', $ids);
            Log::info("Attaching {$relation} {$ids} to user.");
        });

        static::belongsToManyAttached(function ($relation, $parent, $ids) {
            $ids = implode(' & ', $ids);
            Log::info("Computers {$ids} have been attached to user.");
        });
    }

    public function computers() {
        return $this->belongsToMany(Computer::class, 'user_computers');
    }
}

相反,计算机类相同。对于以下代码:

$user = User::create();

$user->computers()->attach([
    Computer::create()->id,
    Computer::create()->id
]);

这是结果:

user::created  
computer::created  
computer::created  
Attaching computers 69 & 70 to user.  
Computers 69 & 70 have been attached to user.