我有一个名为' 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}}
答案 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.