Laravel雄辩的方法updateOrCreate在更新时超过了执行时间

时间:2019-03-14 09:28:56

标签: php laravel vue.js eloquent

所以问题是,当我尝试更新我的实体时,它发现它会对其进行更新,但是可能卡在循环中并且不会退出。当我检查数据库时,即使在执行时间60秒钟之前,我已更改的值也会更新。 如果我不断刷新(这是令人发疯的地方),则在执行此循环时,其他讲座的值更新将开始每秒更改。 创建时(在条件上找不到ID会毫无问题地创建它)

我的讲座看起来像这样:

class Lecture extends Model
{
use Searchable;
use SoftDeletes;

protected $primaryKey = 'id';

protected $touches = ['themes', 'educationTypes', 'subjects'];


protected $fillable= [
    'name', 'description', 'user_id', 'field_id', 'approved'
];


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

    static::saved(function ($model) {
        $model->themes->filter(function ($item) {
            return $item->shouldBeSearchable();
        })->searchable();
    });
}



public function user(){
    return $this->belongsTo('App\User')->with('companies');
}

public function geographies(){
    return $this->belongsToMany('App\Geography');
}

public function educationTypes(){
    return $this->belongsToMany('App\EducationType', 'lecture_education_type')->withTimestamps();;
}

public function themes(){
    return $this->belongsToMany('App\Theme','lecture_theme', 'lecture_id', 'theme_id')->withTimestamps();;
}

public function subjects(){
    return $this->belongsToMany('App\Subject', 'lecture_subject')->withTimestamps();;
}

public function cases(){
    return $this->belongsToMany(
        'App\CompanyCase' ,
        'case_company_lecture',
        'lecture_id',
        'case_id',
        'id',
        'id')->withTimestamps();
}

public function companies(){
    return $this->belongsToMany(
        'App\Company' ,
        'case_company_lecture',
        'lecture_id',
        'company_id',
        'id',
        'id'
    );
}

public function field(){
    return $this->belongsTo('App\Field');
}

public function toSearchableArray()
{
    $this->themes;
    $this->user;
    $this->educationTypes;
    $this->subjects;
    $this->geography;

    return $this->toArray();

 }
}

这是控制器:

    public function storeLecture(Request $request) {
    $lecture_id = $request->get('lecture_id');

    // It gets stuck between the comments
    $lecture = Lecture::updateOrCreate(['id' => $lecture_id],
    [
        'name'=> request('name'),
        'description'=> request('description'),
        'user_id'=> request('user_id')]
    );
    // and doesn't update the themes, edu types subjects and etc.

    $company_id = $request->get('company_id');
    $company = Company::find(request('company_id'));
    $lecture->companies()->sync([$company->id]);

    $eduTypes= $request->get('education_types');
    $themes= $request->get('themes');
    $subjects = $request->get('subjects');
    $geographies = $request->get('geographies');

    $lecture->themes()->sync($themes);
    $lecture->educationTypes()->sync($eduTypes);
    $lecture->subjects()->sync($subjects);
    $lecture->geographies()->sync($geographies);

    $n1 = new Notification();
    $n1->send(request('user_id'), 1, 'new_lecture', $lecture->id);


    $user = User::where('id', $request->id)->first();
    $user_with_companies = $user->load('companies');
    $slug = $user_with_companies->companies->first()->slug;
    return response(['success' => true]);
}

这是发送请求的前端方法(在这之间,我有一个中间件,基于this.selectedExpert.id检查用户是否是admin(可以创建演讲),这不会造成干扰)。

    createUpdateLecture() {
  const url = `${window.location.origin}/lecture/create/${
    this.selectedExpert.id
  }`;
  this.$http
    .post(url, {
      education_types: this.allEducationTypes
        .filter(el => el.checked)
        .map(a => a.id),
      themes: this.allThemes.filter(el => el.checked).map(a => a.id),
      geographies: this.allGeographies
        .filter(el => el.checked)
        .map(a => a.id),
      subjects: this.allSubjects.filter(el => el.checked).map(a => a.id),
      name: this.lecture.name,
      description: this.lecture.description,
      user_id: this.selectedExpert.id,
      company_id: this.company.id,
      lecture_id: this.lecture.id
    })
    .then(res => {
      console.log(res);
      this.$parent.showLectureCreateModal = false;
      // window.location.reload();
    });
}

我可以看到正在发生的事情,我可能真的很糟糕地使用了该方法,但是我只是想更好地理解它以便进一步使用。

1 个答案:

答案 0 :(得分:1)

经过几天的研究和测试,事实证明不是updateOrCreate方法导致了此问题,因为我尝试使用两个不同的函数来创建和更新,并且update函数仍然具有同样的问题。

该问题是由Algolia创建的,用于基于平台中的不同字段进行搜索。 Fx。在主题中

class Theme extends Model
{
use SoftDeletes;

use Searchable;
protected $touches = ['lectures'];

public  function lectures(){
    return $this->belongsToMany('App\Lecture');
}

public function toSearchableArray()
{
    $this->lectures;
    return $this->toArray();
}
}

从模型中删除可搜索对象就可以了!