gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 23:45:02 28 4
gpt4 key购买 nike

我有一个名为“Poll”的模型。在 Poll 模型中,我定义了一个引导方法,如下所示:

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

self::created(function($model){
// dd($model);
$speakers = $model->speakers()->get();
// dd($speakers);

// What I want to do here is: create poll options relation from speakers as follows
// $poll->poll_options()->create([
// 'option' => $speaker->name,
// ]);
}
}

我正在添加说话者关系,它运行良好。

但是在这个引导方法中,如果我试图获取扬声器关系,在 self::created 内部,它总是空的(dd($speakers) 行)。是因为boot方法在模型保存到数据库后就运行了,而关系根本没有保存吗?

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

更新

我也尝试过事件。我的投票模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Backpack\CRUD\CrudTrait;
use Cookie;
use App\Events\PollCreated;

class Poll extends Model
{
........
protected $events = [
'created' => PollCreated::class,
];
.......

public function speakers()
{
return $this->belongsToMany('App\Models\Speaker','poll_speaker','poll_id','speaker_id');
}
}

app/Events/PollCreated.php:

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'));
}
}

这里我也没有得到发言者,在行中:dd($poll->speakers()->get());

我的音箱型号:

    <?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');
}
……..
}

最佳答案

问题在于时间,因为模型必须始终在创建之前才能设置为多对多关系。因此,在 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.

关于php - Laravel 5.4 关系未在模型启动方法中加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47179406/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com