এলওলিউড সহ কোনও মডেলের উপ-টাইপের উদাহরণ পান Get


22

টেবিলের Animalউপর ভিত্তি করে আমার একটি মডেল আছে animal

এই টেবিলটিতে একটি typeক্ষেত্র রয়েছে , এতে বিড়াল বা কুকুরের মতো মান থাকতে পারে ।

আমি এই জাতীয় বস্তু তৈরি করতে সক্ষম হতে চাই:

class Animal extends Model { }
class Dog extends Animal { }
class Cat extends Animal { }

তবুও, এই জাতীয় একটি প্রাণী আনতে সক্ষম:

$animal = Animal::find($id);

কিন্তু কোথায় $animalএর একটি দৃষ্টান্ত হবে Dogবা Catতার উপর নির্ভর করে typeক্ষেত্র, যে আমি ব্যবহার পরীক্ষা করতে পারবেন instance ofঅথবা যে টাইপ hinted পদ্ধতি সঙ্গে কাজ করবে। কারণটি হল 90% কোড ভাগ করা থাকলেও একটিটি বার্ক করতে পারে এবং অন্যটি মায়ো করতে পারে।

আমি জানি যে আমি এটি করতে পারি Dog::find($id), তবে আমি যা চাই তা তা নয়: আমি কেবল একবার ऑब्जेक्टটি আনার পরে তা নির্ধারণ করতে পারি। আমি প্রাণীটি আনতে পারি এবং তারপরে find()ডান অবজেক্টে চালাতে পারি , তবে এটি দুটি ডাটাবেস কল করছে, যা আমি অবশ্যই চাই না।

আমি কুকুর থেকে প্রাণীর মতো একটি স্বতন্ত্র মডেলটিকে "ম্যানুয়ালি" ইনস্ট্যান্ট করার উপায় অনুসন্ধান করার চেষ্টা করেছি, তবে এর সাথে সম্পর্কিত কোনও পদ্ধতি আমি খুঁজে পাইনি। কোন ধারণা বা পদ্ধতি আমি মিস করেছি দয়া করে?


@ বি 001 course অবশ্যই, আমার কুকুর বা বিড়াল শ্রেণীর সাথে একই ইন্টারফেস রয়েছে, আমি দেখতে পাচ্ছি না যে এটি এখানে কীভাবে সহায়তা করে?
ক্লামেন্টএম

@ ক্লিমেন্টএম দেখে মনে হচ্ছে একাধিক বহু বহু-বহু সম্পর্কের লারাভেল.com
ডকস /

@ vivek_23 সত্যিই নয়, এক্ষেত্রে এটি একটি প্রদত্ত ধরণের মন্তব্যগুলি ফিল্টার করতে সহায়তা করে তবে আপনি ইতিমধ্যে জানেন যে আপনি শেষ পর্যন্ত মন্তব্যগুলি চান। এখানে প্রয়োগ হয় না।
ক্লামেন্টএম

@ ক্ল্যামেন্টএম আমার মনে হয় এটি হয়। প্রাণী ক্যাট বা কুকুর হতে পারে। সুতরাং, আপনি যখন প্রাণীর টেবিল থেকে প্রাণীর ধরণের পুনরুদ্ধার করবেন, এটি আপনাকে কুকুর বা ক্যাট উভয়েরই উদাহরণ দেয় যা ডাটাবেসে সঞ্চিত থাকে তার উপর নির্ভর করে। শেষ লাইনটি বলেছে যে মন্তব্য মডেলটিতে মন্তব্যযোগ্য সম্পর্কটি কোনও পোস্ট বা ভিডিও উদাহরণ ফিরিয়ে দেবে, তার উপর নির্ভর করে কোন ধরণের মডেল মন্তব্যটির মালিক।
vivek_23

@ vivek_23 আমি ডকুমেন্টেশনে আরও ডুব দিয়েছি এবং এটিকে চেষ্টা করেছি, তবে সাব-টাইপ *_typeমডেলটি নির্ধারণ করতে নামটি সহ প্রকৃত কলামের ভিত্তিতে বুদ্ধিমান । আমার ক্ষেত্রে আমার কাছে কেবলমাত্র একটি টেবিল রয়েছে, সুতরাং এটি একটি দুর্দান্ত বৈশিষ্ট্য, আমার ক্ষেত্রে নয়।
ক্লামেন্টএম

উত্তর:


7

অফিসিয়াল লারাভেল ডক্সে বর্ণিত হিসাবে আপনি লারাভেলে পলিমারফিক সম্পর্ক ব্যবহার করতে পারেন । আপনি কীভাবে এটি করতে পারেন তা এখানে।

মডেলটিতে প্রদত্ত সম্পর্কগুলি সংজ্ঞায়িত করুন

class Animal extends Model{
    public function animable(){
        return $this->morphTo();
    }
}

class Dog extends Model{
    public function animal(){
        return $this->morphOne('App\Animal', 'animable');
    }
}

class Cat extends Model{
    public function animal(){
        return $this->morphOne('App\Animal', 'animable');
    }
}

এখানে আপনার animalsটেবিলে দুটি কলামের প্রয়োজন , প্রথমটি হ'ল animable_typeএবং অন্যটি animable_idএটির সময় সংযুক্ত মডেলের ধরণ নির্ধারণ করা।

আপনি প্রদত্ত কুকুর বা বিড়াল মডেল আনতে পারেন,

$animal = Animal::find($id);
$anim = $animal->animable; //this will return either Cat or Dog Model

এর পরে, আপনি $animব্যবহার করে অবজেক্টের ক্লাস পরীক্ষা করতে পারেন instanceof

আপনি যদি অ্যাপ্লিকেশনটিতে অন্য কোনও প্রাণীর ধরণের (যেমন শিয়াল বা সিংহ) যোগ করেন তবে এই পদ্ধতির আপনাকে ভবিষ্যতের প্রসারণে সহায়তা করবে। এটি আপনার কোডবেস পরিবর্তন না করে কাজ করবে। এটি আপনার প্রয়োজনীয়তা অর্জনের সঠিক উপায়। তবে পলিমারফিক্স সম্পর্ক ব্যবহার না করে পলিমারফিজম এবং আগ্রহী লোড একসাথে অর্জনের বিকল্প বিকল্প নেই। যদি আপনি পলিমারফিক সম্পর্ক ব্যবহার না করেন তবে আপনি আরও একটি ডেটাবেস কল দিয়ে শেষ করবেন। তবে, যদি আপনার কাছে একটি একক কলাম থাকে যা মডেল প্রকারটিকে পৃথক করে, সম্ভবত আপনার একটি ভুল কাঠামোগত স্কিমা রয়েছে। আমি আপনাকে উন্নতি করার পরামর্শ দিচ্ছি যদি আপনি ভবিষ্যতের বিকাশের পাশাপাশি এটি আরও সরল করতে চান।

মডেলের অভ্যন্তরীণ পুনর্লিখন newInstance()এবং newFromBuilder()একটি ভাল / প্রস্তাবিত উপায় নয় এবং ফ্রেমওয়ার্ক থেকে আপডেটটি পাওয়ার পরে আপনাকে তার উপর আবার কাজ করতে হবে।


1
প্রশ্নের মন্তব্যে তিনি বলেছিলেন, তাঁর কেবল একটি টেবিল রয়েছে এবং ওপির ক্ষেত্রে পলিমারফিক বৈশিষ্ট্যগুলি ব্যবহারযোগ্য নয়।
শক_গোন_ওয়াল্ড

3
আমি কেবল উল্লেখ করছি, প্রদত্ত দৃশ্যটি কেমন। আমি ব্যক্তিগতভাবে
পলিমারফিক

1
@ কিরণমানিয়া আপনার বিস্তারিত উত্তরের জন্য আপনাকে ধন্যবাদ। আমি আরও পটভূমি আগ্রহী। (1) প্রশ্নকারীদের ডাটাবেস মডেলটি কেন ভুল এবং (2) জনসাধারণ / সুরক্ষিত সদস্যের কার্যাদি বাড়ানো ভাল / প্রস্তাবিত নয় তা কী আপনি ব্যাখ্যা করতে পারেন?
ক্রিস্টোফ ক্লুজ

1
@ ক্রিসটফক্লুজে, আপনি ইতিমধ্যে জানেন। (1) ডিবি মডেল লারাভেল ডিজাইনের ধরণগুলির প্রসঙ্গে ভুল। আপনি যদি লারাভেল দ্বারা সংজ্ঞায়িত ডিজাইনের প্যাটার্নটি অনুসরণ করতে চান তবে আপনার এটি অনুযায়ী ডিবি স্কিমা থাকা উচিত। (২) এটি একটি ফ্রেমওয়ার্ক অভ্যন্তরীণ পদ্ধতি যা আপনি ওভাররাইড করার পরামর্শ দিয়েছেন। আমি যদি কখনও এই সমস্যার মুখোমুখি হই তবে আমি এটি করব না। লারাভেল কাঠামোটিতে অন্তর্নির্মিত বহুসত্ত্ব সমর্থন রয়েছে তাই আমরা চাকাটিকে পুনরায় আবিষ্কার করার পরিবর্তে কেন ব্যবহার করব না? উত্তরে আপনি একটি ভাল ধারণা দিয়েছেন কিন্তু আমি কখনই অসুবিধাগুলি সহ কোডটিকে পছন্দ করি না এর পরিবর্তে আমরা এমন কিছু কোড করতে পারি যা ভবিষ্যতের প্রসারকে সহজতর করতে সহায়তা করে।
কিরণ মানিয়া

2
তবে ... পুরো প্রশ্নটি লারাভেল ডিজাইনের ধরণ সম্পর্কে নয়। আবার, আমাদের একটি প্রদত্ত দৃশ্য রয়েছে (সম্ভবত কোনও বাহ্যিক অ্যাপ্লিকেশন দ্বারা ডেটাবেস তৈরি করা হয়েছে)। সকলেই সম্মত হবেন যে আপনি যদি স্ক্র্যাচ থেকে তৈরি করেন তবে পলিমার্ফিজম হবার উপায় হবে। আসলে আপনার উত্তরটি টেকনিক্যালি মূল প্রশ্নের উত্তর দেয় না।
শক_গোন_ওয়াল্ড

5

আমি মনে করি আপনি মডেলটিতে newInstanceপদ্ধতিটি ওভাররাইড করতে পারেন Animal, এবং বৈশিষ্ট্যগুলি থেকে প্রকারটি পরীক্ষা করতে পারেন এবং তারপরে সংশ্লিষ্ট মডেলটি টিপতে পারেন।

    public function newInstance($attributes = [], $exists = false)
    {
        // This method just provides a convenient way for us to generate fresh model
        // instances of this current model. It is particularly useful during the
        // hydration of new objects via the Eloquent query builder instances.
        $modelName = ucfirst($attributes['type']);
        $model = new $modelName((array) $attributes);

        $model->exists = $exists;

        $model->setConnection(
            $this->getConnectionName()
        );

        $model->setTable($this->getTable());

        $model->mergeCasts($this->casts);

        return $model;
    }

আপনাকে newFromBuilderপদ্ধতিটি ওভাররাইড করতে হবে ।


    /**
     * Create a new model instance that is existing.
     *
     * @param  array  $attributes
     * @param  string|null  $connection
     * @return static
     */
    public function newFromBuilder($attributes = [], $connection = null)
    {
        $model = $this->newInstance([
            'type' => $attributes['type']
        ], true);

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

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

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

        return $model;
    }

আমি কীভাবে এটি কাজ করে তা জানিনা। অ্যানিম্যাল :: সন্ধান (1) একটি ত্রুটি ছুঁড়ে ফেলবে: আপনি অ্যানিম্যালকে কল করুন: "অপরিবর্তিত সূচক প্রকার": সন্ধান করুন (1)। নাকি আমি কিছু মিস করছি?
শক_গোন_ওয়াল্ড

@ শক_গোন_ওয়াইল্ড আপনার কি typeডাটাবেসে একটি কলামের নাম আছে?
ক্রিস নিল

হ্যাঁ আমার আছে. তবে আমি ডিডি (rit এরিটিউবিটস) করলে $ গুণাবলী অ্যারে খালি থাকে। যা পুরোপুরি অর্থবোধ করে। আপনি কিভাবে এটি একটি বাস্তব উদাহরণে ব্যবহার করবেন?
shock_gone_wild

5

আপনি যদি সত্যিই এটি করতে চান তবে নীচের পদ্ধতিটি আপনার পশুর মডেলের অভ্যন্তরে ব্যবহার করতে পারেন।

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Animal extends Model
{

    // other code in animal model .... 

    public static function __callStatic($method, $parameters)
    {
        if ($method == 'find') {
            $model = parent::find($parameters[0]);

            if ($model) {
                switch ($model->type) {
                    case 'dog':
                        return new \App\Dog($model->attributes);
                    case 'cat':
                        return new \App\Cat($model->attributes);
                }
                return $model;
            }
        }

        return parent::__callStatic($method, $parameters);
    }
}

5

ওপি যেমন তার মন্তব্যের অভ্যন্তরে বলেছিল: ডাটাবেস ডিজাইনটি ইতিমধ্যে সেট করা আছে এবং তাই লারাভেলের পলিমারফিক সম্পর্ক এখানে কোনও বিকল্প বলে মনে হচ্ছে না।

আমি ক্রিস নীলের উত্তরটি পছন্দ করি কারণ সম্প্রতি আমাকে অনুরূপ কিছু করতে হয়েছিল (ডিবেস / ডিবিএফ ফাইলগুলির জন্য এলওলিউর সমর্থন করার জন্য আমার নিজের ডেটাবেস ড্রাইভারকে লেখার জন্য) এবং লারাভেলের এলওভারেন্ট ওআরএম এর অভ্যন্তরীণ সাথে অনেক অভিজ্ঞতা অর্জন করেছিল।

আমি মডেল প্রতি সুস্পষ্ট ম্যাপিংয়ের সময় কোডটিকে আরও গতিশীল করার জন্য এটিতে আমার ব্যক্তিগত গন্ধ যুক্ত করেছি।

সমর্থিত বৈশিষ্ট্য যা আমি দ্রুত পরীক্ষা করেছি:

  • Animal::find(1) আপনার প্রশ্নে জিজ্ঞাসা মত কাজ করে
  • Animal::all() পাশাপাশি কাজ করে
  • Animal::where(['type' => 'dog'])->get()AnimalDogসংগ্রহ হিসাবে-অবজেক্টস ফিরে আসবে
  • গতিশীল-শ্রেণীর জন্য গতিশীল অবজেক্ট ম্যাপিং যা এই বৈশিষ্ট্যটি ব্যবহার করে
  • Animalকোনও ম্যাপিং কনফিগার করা না থাকলে (অথবা ডিবিতে একটি নতুন ম্যাপিং উপস্থিত হয়েছে) ক্ষেত্রে ফ্যালব্যাক থেকে মডেল

অসুবিধা:

  • এটি মডেলের অভ্যন্তরীণ newInstance()এবং newFromBuilder()সম্পূর্ণরূপে (অনুলিপি এবং পেস্ট) পুনর্লিখন করছে । এর অর্থ যদি এই সদস্যের কার্যকারিতা থেকে ফ্রেমওয়ার্ক থেকে কোনও আপডেট আসে তবে আপনাকে হাতে হাতে কোড গ্রহণ করতে হবে।

আমি আশা করি এটি আপনার দৃশ্যে কোনও পরামর্শ, প্রশ্ন এবং অতিরিক্ত ব্যবহারের ক্ষেত্রে সহায়তা করবে এবং আমি প্রস্তুত। এটির জন্য ব্যবহারের ক্ষেত্রে এবং উদাহরণগুলি এখানে:

class Animal extends Model
{
    use MorphTrait; // You'll find the trait in the very end of this answer

    protected $morphKey = 'type'; // This is your column inside the database
    protected $morphMap = [ // This is the value-to-class mapping
        'dog' => AnimalDog::class,
        'cat' => AnimalCat::class,
    ];

}

class AnimalCat extends Animal {}
class AnimalDog extends Animal {}

এবং এটি এটি কীভাবে ব্যবহার করা যেতে পারে এবং এর জন্য নীচে সম্পর্কিত ফলাফলগুলির নীচে এটি একটি উদাহরণ:

$cat = Animal::find(1);
$dog = Animal::find(2);
$new = Animal::find(3);
$all = Animal::all();

echo sprintf('ID: %s - Type: %s - Class: %s - Data: %s', $cat->id, $cat->type, get_class($cat), $cat, json_encode($cat->toArray())) . PHP_EOL;
echo sprintf('ID: %s - Type: %s - Class: %s - Data: %s', $dog->id, $dog->type, get_class($dog), $dog, json_encode($dog->toArray())) . PHP_EOL;
echo sprintf('ID: %s - Type: %s - Class: %s - Data: %s', $new->id, $new->type, get_class($new), $new, json_encode($new->toArray())) . PHP_EOL;

dd($all);

যা নিম্নলিখিত ফলাফল:

ID: 1 - Type: cat - Class: App\AnimalCat - Data: {"id":1,"type":"cat"}
ID: 2 - Type: dog - Class: App\AnimalDog - Data: {"id":2,"type":"dog"}
ID: 3 - Type: new-animal - Class: App\Animal - Data: {"id":3,"type":"new-animal"}

// Illuminate\Database\Eloquent\Collection {#1418
//  #items: array:2 [
//    0 => App\AnimalCat {#1419
//    1 => App\AnimalDog {#1422
//    2 => App\Animal {#1425

এবং যদি আপনি চান যে আপনি MorphTraitএখানে ব্যবহার করতে চান অবশ্যই এটির জন্য সম্পূর্ণ কোড:

<?php namespace App;

trait MorphTrait
{

    public function newInstance($attributes = [], $exists = false)
    {
        // This method just provides a convenient way for us to generate fresh model
        // instances of this current model. It is particularly useful during the
        // hydration of new objects via the Eloquent query builder instances.
        if (isset($attributes['force_class_morph'])) {
            $class = $attributes['force_class_morph'];
            $model = new $class((array)$attributes);
        } else {
            $model = new static((array)$attributes);
        }

        $model->exists = $exists;

        $model->setConnection(
            $this->getConnectionName()
        );

        $model->setTable($this->getTable());

        return $model;
    }

    /**
     * Create a new model instance that is existing.
     *
     * @param array $attributes
     * @param string|null $connection
     * @return static
     */
    public function newFromBuilder($attributes = [], $connection = null)
    {
        $newInstance = [];
        if ($this->isValidMorphConfiguration($attributes)) {
            $newInstance = [
                'force_class_morph' => $this->morphMap[$attributes->{$this->morphKey}],
            ];
        }

        $model = $this->newInstance($newInstance, true);

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

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

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

        return $model;
    }

    private function isValidMorphConfiguration($attributes): bool
    {
        if (!isset($this->morphKey) || empty($this->morphMap)) {
            return false;
        }

        if (!array_key_exists($this->morphKey, (array)$attributes)) {
            return false;
        }

        return array_key_exists($attributes->{$this->morphKey}, $this->morphMap);
    }
}

শুধু আউট কৌতুহল. এটি কী প্রাণী :: সমস্ত () এর সাথেও কাজ করে? ফলাফল সংগ্রহ কী 'কুকুর' এবং 'বিড়াল' এর মিশ্রণ?
শক_গোন_ওয়াল্ড

@ শক_গোন_উইल्ड বেশ ভাল প্রশ্ন! আমি এটি স্থানীয়ভাবে পরীক্ষা করেছি এবং আমার উত্তরে এটি যুক্ত করেছি। কাজটিও দেখে মনে হচ্ছে :-)
ক্রিস্টোফ ক্লুজ

2
ল্যারাভেলের বিল্ট ফাংশনে সংশোধন করা সঠিক উপায় নয়। ল্যারাভেল আপডেট করার পরে সমস্ত পরিবর্তনগুলি শিথিল হয়ে যাবে এবং এতে সমস্ত কিছু গণ্ডগোল হয়ে যাবে। সচেতন থাকা.
নবীন ডি শাহ

আরে নবীন, এটি উল্লেখ করার জন্য আপনাকে ধন্যবাদ কিন্তু এটি ইতিমধ্যে পরিষ্কারভাবে আমার উত্তরের অসুবিধা হিসাবে বর্ণনা করেছে। পাল্টা প্রশ্ন: তাহলে সঠিক উপায় কী?
ক্রিস্টোফ ক্লুজ

2

আমি মনে করি আপনি জানেন আপনি কি জানেন। এই মার্জিত সমাধানটি বিবেচনা করুন যা লারাভেল ক্যোয়ারী স্কোপগুলি ব্যবহার করে, অতিরিক্ত তথ্যের জন্য https://laravel.com/docs/6.x/eloquent#query-scopes দেখুন :

ভাগ করা যুক্তি ধারণ করে এমন একটি প্যারেন্ট ক্লাস তৈরি করুন:

class Animal extends \Illuminate\Database\Eloquent\Model
{
    const TYPE_DOG = 'dog';
    const TYPE_CAT = 'cat';
}

গ্লোবাল ক্যোয়ারী স্কোপ এবং savingইভেন্ট হ্যান্ডলার সহ একটি শিশু (বা একাধিক) তৈরি করুন :

class Dog extends Animal
{
    public static function boot()
    {
        parent::boot();

        static::addGlobalScope('type', function(\Illuminate\Database\Eloquent\Builder $builder) {
            $builder->where('type', self::TYPE_DOG);
        });

        // Add a listener for when saving models of this type, so that the `type`
        // is always set correctly.
        static::saving(function(Dog $model) {
            $model->type = self::TYPE_DOG;
        });
    }
}

(একই অন্য ক্লাসে প্রযোজ্য Cat, কেবল ধ্রুবকটি প্রতিস্থাপন করুন)

গ্লোবাল ক্যোয়ারী স্কোপটি একটি ডিফল্ট ক্যোয়ারী সংশোধন হিসাবে কাজ করে, যেমন Dogশ্রেণি সর্বদা রেকর্ড সন্ধান করে type='dog'

বলুন আমাদের কাছে 3 টি রেকর্ড রয়েছে:

- id:1 => Cat
- id:2 => Dog
- id:3 => Mouse

এখন কল করার Dog::find(1)ফলাফল ঘটবে null, কারণ ডিফল্ট ক্যোয়ারী স্কোপটি id:1কোনটি খুঁজে পাবে না Cat। কলিং Animal::find(1)এবং Cat::find(1)উভয়ই কাজ করবে, যদিও কেবলমাত্র শেষটি আপনাকে একটি প্রকৃত ক্যাট অবজেক্ট দেয়।

এই সেটআপটির দুর্দান্ত জিনিসটি হল আপনি সম্পর্ক তৈরি করতে উপরের ক্লাসগুলি ব্যবহার করতে পারেন:

class Owner
{
    public function dogs()
    {
        return $this->hasMany(Dog::class);
    }
}

এবং এই সম্পর্কটি স্বয়ংক্রিয়ভাবে আপনাকে type='dog'( Dogশ্রেণির আকারে ) সমস্ত প্রাণী দেবে । ক্যোয়ারির সুযোগটি স্বয়ংক্রিয়ভাবে প্রয়োগ করা হয়েছে।

উপরন্তু, কলিং Dog::create($properties)স্বয়ংক্রিয়ভাবে সেট করা হবে typeথেকে 'dog'কারণে saving(দেখুন ঘটনা হুক https://laravel.com/docs/6.x/eloquent#events )।

নোট করুন কল করার Animal::create($properties)কোনও ডিফল্ট থাকে না typeতাই এখানে আপনাকে ম্যানুয়ালি সেট করতে হবে (যা প্রত্যাশিত হওয়া উচিত)।


0

যদিও আপনি লারাভেল ব্যবহার করছেন তবে আমি মনে করি আপনার লারাভেল শর্ট-কাটসে আটকে থাকা উচিত নয়।

আপনি যে সমস্যাটি সমাধান করার চেষ্টা করছেন সেটি হ'ল একটি ক্লাসিক সমস্যা যা অন্যান্য অনেক ভাষা / ফ্রেমওয়ার্ক ফ্যাক্টরি পদ্ধতির প্যাটার্ন ( https://en.wikedia.org/wiki/Factory_method_ Pattern ) ব্যবহার করে সমাধান করে ।

আপনি যদি নিজের কোডটি সহজে বুঝতে এবং কোনও গোপন কৌশল ব্যবহার না করে রাখতে চান তবে আপনার ফণাটির নীচে লুকানো / যাদু কৌশলগুলির পরিবর্তে একটি সুপরিচিত প্যাটার্ন ব্যবহার করা উচিত।


0

এখনও সহজতম উপায়টি হচ্ছে অ্যানিমাল ক্লাসে পদ্ধতি তৈরি করা

public function resolve()
{
    $model = $this;
    if ($this->type == 'dog'){
        $model = new Dog();
    }else if ($this->type == 'cat'){
        $model = new Cat();
    }
    $model->setRawAttributes($this->getAttributes(), true);
    return $model;
}

সমাধান মডেল

$animal = Animal::first()->resolve();

এটি মডেল ধরণের উপর নির্ভর করে প্রাণী, কুকুর বা বিড়াল শ্রেণীর উদাহরণ ফিরে আসবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.