اذهب إلى المحتوى

السؤال

نشر

لدي نموذج Eloquent له نموذج مرتبط:

public function option() {
    return $this->hasOne('RepairOption', 'repair_item_id');
}

public function setOptionArrayAttribute($values)
{
    $this->option->update($values);
}

عندما أقوم بإنشاء النموذج ، فإنه لا يحتوي بالضرورة على نموذج مرتبط. عندما أقوم بتحديثه ، قد أضيف خيارًا أم لا. لذلك أحتاج إلى التحقق من وجود النموذج ذي الصلة ، إما لتحديثه أو إنشائه ، على التوالي:

$model = RepairItem::find($id);
if (Input::has('option')) {
    if (<related_model_exists>) {
        $option = new RepairOption(Input::get('option'));
        $option->repairItem()->associate($model);
        $option->save();
        $model->fill(Input::except('option');
    } else {
       $model->update(Input::all());
    }
};

حيث <related_model_exists> هو الكود الذي أبحث عنه.

Recommended Posts

  • 0
نشر

في php 7.2, لا يمكنك استخدام count على relation object, لذلك لا توجد طريقة واحدة تناسب الجميع لجميع العلاقات.

$model->relation()->exists()

حل عام يعمل على جميع أنواع العلاقات (php 7.2):

if (count($model->relation))
{
  // exists
}

سيعمل هذا مع كل علاقة لأن الخصائص الديناميكية ترجع النموذج أو المجموعة. كلاهما يقوم بتطبيق ArrayAccess.

single relations: hasOne / belongsTo / morphTo / morphOne

$model->relation;
count($model->relation); 

$model->relation;
count($model->relation);
to-many relations: hasMany / belongsToMany / morphMany / morphToMany / morphedByMany

$model->relation;
count($model->relation); 

$model->relation;
count($model->relation);

 

  • 0
نشر

يُمكنك ببساطة إستخدام التابع updateOrCreate في هذه الحالة:

$model = RepairItem::find($id);
if (!empty($temp = $request->input('option'))) {  
$model->option()
  ->updateOrCreate(
	['repair_item_id' => $model->id],
	['option' => $temp]
);
}

كما يُمكنك ذلك بهذا الشكل:

$model = RepairItem::find($id);
if (!empty($temp = $request->input('option'))) {
   $option = $model->option;

   if(empty($option)){
      $option = $model->option()->create();
   }

   $option->someAttribute = temp;
   $option->save();
};

 

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...