Метод Laravel Eloquent updateOrCreate превышает время выполнения при обновлении - PullRequest
2 голосов
/ 14 марта 2019

Таким образом, проблема в том, что когда я пытаюсь обновить свою сущность, она находит, что обновляет ее, но, вероятно, застревает в цикле и не завершается.Когда я проверяю базу данных, даже до истечения 60-секундного времени выполнения, значения, которые я изменил, обновляются.Если я постоянно обновляюсь (и вот где это сходит с ума), обновленные значения для других лекций начинают меняться каждую секунду, пока он выполняет этот цикл.При создании (не находя идентификатор по условию Создает его без проблем)

У меня есть лекции, которые выглядят так:

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, который не мешает).

    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 Ответ

1 голос
/ 14 марта 2019

После нескольких дней исследования и тестирования выясняется, что это не метод updateOrCreate , вызывающий проблему, потому что я пытался использовать две разные функции для создания и обновления, а функция обновления все еще работалапроблема.

Проблема создана из Алголии, которая используется для поиска по различным полям в платформе.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();
}
}

Удаление поиска из моделей сделало свое дело!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...