Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Is it possible to get a collection of different model types for a model using eloquent?

If I have a model that needs to have a property that is an array of different models. Is there an eloquent method or way to handle this kind of problem?

eg. I have a Feature model that needs a method that gets an array of objects that are from different models.

class Feature extends Model
{

    public function getArrayOfDifferentObjects()
    {
        $array_of_objects=array();

        ???? ELOQUENT to get objects from different models ????

        return $array_of_objects;
    }

}

I have a feature_model_connections table with the following:

  • feature_id
  • featured_model_id
  • featured_model_type

The featured_model_type value would be a string denoting the model type. The model_id would be a foreign key of the relevant model's table.

However I can't see how you would be able to use eloquent to return data for the getArrayOfDifferentObjects method in features model.

Any pointers would be much appreciated. Many thanks, J

like image 673
jon Avatar asked Jan 29 '26 22:01

jon


1 Answers

What you are describing there, is basicly a Polymorphic Relations, which can handle these cases, and making fetching them easy, instead of i'm making a made up case, read the documentation, it is well written, under the section Polymorphic Relations. https://laravel.com/docs/5.1/eloquent-relationships#polymorphic-relations

Within your scope right now, you can do something like this.

public function getArrayOfDifferentObjects()
{
    $objects = [];

    $features = DB::table('feature_model_connections')
              ->select('feature_id', 'featured_model_id', 'featured_model_type')->get();

    foreach($features as $feature)
    {
        $type = '\\App\\' . $feature->featured_model_type; //App is you app namespace

        $model = $type::find($feature->featured_model_id);

        if($model)
            $objects[] = $model;
    }

    return $objects;
}

The basics of this, is you can define different types, with the app namespace seed, from there staticly call them, which will access the predefined type in your database table, then find the element and add it to the array. With that said, this is done as of the top of my head, no compile check, not ranned in Laravel, but it should pretty much get you the idea of what to do, with that said, if you can change your structure, go with the Polymorphic Relations, it is really awesome.

like image 198
mrhn Avatar answered Jan 31 '26 12:01

mrhn



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!