Laravel Eloquent: ما هي دورة حياة نموذج Eloquent

0

مع هذا الرمز (نظريا)

class Application extends Model
{
   protected $onlineApplication;

   public function __construct(Array $attributes = [])
   {
        parent::__construct($attributes);
        if(!empty($this->id)){ //To say if model is already saved in database

            /*I fetch informations in api based on app_identifier attribute.
            Then, I can play with methodq to perform different actions. 
            For instance, self::getCredentials() according to what
            self::onlineApplication would have*/
        }
        $this->onlineApplication = $this->id;
   }

   public function getOnlineApplication()
   {
       return $this->onlineApplication;
   }
}

على سبيل المثال ، عندما أتصل Application::all() ، فإنها ترجع هذه النتيجة

 Illuminate\Database\Eloquent\Collection {#2954
 all: [
   App\Application {#2955
     id: 1,
     name: "isipa.cd",
     app_identifier: "569161",
     server_id: 1,
     zone_dns: "7b716ac4ab6c1c442133cf03c475988b",
     created_at: "2018-07-29 04:59:57",
     updated_at: "2018-07-29 04:59:57",
   },
   App\Application {#2956
     id: 2,
     name: "ohelene.tk",
     app_identifier: "570161",
     server_id: 1,
     zone_dns: "090857997858a77f7ab635e47d6bcce8",
     created_at: "2018-07-30 14:12:03",
     updated_at: "2018-07-30 14:12:03",
   },
 ],

}}

الآن ، ما أريد معرفته هو لماذا عندما يكون هذا الرمز - أدناه - لدي هذه النتيجة ، لماذا $this->id داخل منشئ عودة فارغة؟

$app = Application::find(2);
$app->getOnlineApplication(); // return null. I expected 2 as result

متى $this->id أو $this->attributes['id'] يمكن إرجاع القيمة المعينة لجدول التطبيق؟

2 الاجابة

2
افضل جواب

يعمل Eloquent Query Builder على ترطيب النتائج باستخدام Model :: newFromBuilder.

public function newFromBuilder($attributes = [], $connection = null)
{
    $model = $this->newInstance([], true);

    $model->setRawAttributes((array) $attributes, true);

    $model->setConnection($connection ?: $this->getConnectionName());

    $model->fireModelEvent('retrieved', false);

    return $model;
}

حتى هنا ، يمكنك أن ترى إنشاء نسخة فارغة جديدة ثم يتم ملء السمات مع setRawAttributes. وبالتالي، $this->id أو $this->attributes['id'] لن تكون موجودة بعد في المنشئ.

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


بالنظر إلى الشفرة ، يبدو أن الاختلاف الرئيسي بين تمرير السمات من خلال المنشئ ومن خلال setRawAttributes هو الأخير عن طريق تمرير الاستثناءات والتعيينات الجماعية الضخمة.

:مؤلف
0

وراء الكواليس ، أعجّل Laravel نموذجك ثم نفذ طريقة "البحث". على الرغم من أنه يبدو أن البحث هو طريقة ثابتة ، إلا أنها ليست كذلك.

معرف $ this-> غير متوفر في الوقت الحالي ولكن بعد ذلك فقط.

على الرغم من أنه لا يرتبط مباشرة بسؤالك ، يبدو أنك تحاول تعيين $ this-> id في $ this-> onlineApplication - يرجى مراعاة الكود التالي الذي سيعمل بشكل مثالي لاحتياجاتك:

غيّر صفك إلى:

class Application extends Model
{

   protected $appends = ['online_application'];

   public function __construct(Array $attributes = [])
   {
        parent::__construct($attributes);
   }

   public function getOnlineApplication()
   {
       return $this->online_application;
   }

   public function getOnlineApplicationAttribute(){
       return $this->attributes['id'];
   }
}

أو حتى أكثر بساطة:

class Application extends Model
{

   public function __construct(Array $attributes = [])
   {
        parent::__construct($attributes);
   }

   public function getOnlineApplication()
   {
       return $this->attributes['id'];
   }
}
:مؤلف
فوق
قائمة طعام