سؤال

I have 4 mysql tables, as the following:

 Makes:
 id - make_name

 Models:
 id - model_name - make_id

 Trims:
 id - trim_name - model_id

 Forsale_Cars:
 id - trim_id - year - price

in the Makes table I have ~700 records, so my question is, how can get a list of Makes which only have a child trim in the forsale table?

I have 20 records in the forsale table, I want to get the list of Makes for these cars.

I am using Laravel, so if anybody has achieved that previously using eloquent it will be great

هل كانت مفيدة؟

المحلول

Eloquent way:

// Makes that have forsale nested relation
Make::whereHas('models', function ($q) {
    $q->whereHas('trims', function ($q) {
        $q->has('forsales');
    });
})->get(); // returns Eloquent Collection

Models with correct relations (hasMany can be replaced with hasOne if that's actual relation somewhere):

// Make model
public function models()
{
    return $this->hasMany('CarModel');
}

// CarModel (as you can't use Model name)
public function trims()
{
    return $this->hasMany('Trim');
}
public function make()
{
    return $this->belongsTo('Make');
}

// Trim model
public function forsales()
{
    return $this->hasMany('Forsale');
}
public function carModel()
{
    return $this->belongsTo('CarModel');
}

// Forsale model
public function trim()
{
    return $this->belongsTo('Trim');
}

نصائح أخرى

You could use this query for the first question you asked. Not sure if the this completely answers your question.

SELECT * FROM Makes m left join Foresale_Cars fc on (m.id = fc.id) left join Trims t on (fc.trim_id = t.id) where t.trim_name = "child trim"

I assume you have all your models set up, e.g.:

class Makes extends Eloquent {
    protected $table = 'makes';

    public function models() {
        return $this->hasMany('Model', 'makes_id');
    }
}

and so on.. (you have to do this with all your models, of course)

Now, if you want to get all the cars for sale you'd simply chain some foreach loops:

foreach( $makes->models as $model ) {
    foreach( $model->trims as $trim ) {
           {{ $trim->forsale_cars }}
                ...
    }
}

Edit: Yes you can use raw queries, of course, but using models and the power of eloquent is much more elegant and useful...

For more information on this topic: http://laravel.com/docs/eloquent#relationships

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top