ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

php – Laravel 5.4没有在模型启动方法中加载关系

2019-07-10 18:30:34  阅读:142  来源: 互联网

标签:php laravel laravel-5-4


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

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)行).是因为引导方法在模型保存到DB之后运行而且关系根本没有保存?

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

UPDATE

我也尝试过活动.
我的民意调查模型:

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

应用程序/活动/ 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');
        }
    ……..
    }

解决方法:

问题在于时间,因为必须始终创建模型才能将它们设置为多对多关系.因此,在创建事件期间,在多对多关系中没有可能的方式已经设置了关系,因为创建的事件总是在关系之前被提升.

任何寻找解决方案的人都可以尝试使用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,laravel-5-4
来源: https://codeday.me/bug/20190710/1426648.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有