Yamona
Yamona

Reputation: 1130

Laravel query Model

I got strange behavior when creating scope function inside model

class Measurement extends Model {
        public function scopeGetMeasurement($query, $user_id) {
            $measurements = $query->where('user_id', $user_id)
                ->join('measurement_metas', 'measurements.id', '=', 'measurement_metas.measurement_id')
                ->join('units', 'measurement_metas.unit_id', '=', 'units.id');

            return $measurements;
        }
    }

I have 3 tables like this: measurements

measurements measurement_metas

measurement_metas units

units What happen $measurements return id as unit_id not measurements.id JSON

What I am doing wrong?

Clarifying: All I want is the 'id' become = 'measurements.id' not 'units.id', but since the 'units.id' come last it appear as the 'id'.

Upvotes: 0

Views: 73

Answers (1)

Jonas Staudenmeir
Jonas Staudenmeir

Reputation: 25906

Your query selects all columns of all joined tables (SELECT *), so the last id column (unit) overwrites the previous ones (measurements, measurement_metas).

You should use relationships for this kind of queries:
https://laravel.com/docs/5.6/eloquent-relationships

For example:
User → HasMany → Measurement
Measurement → HasMany → Measurement_Meta
Measurement_Meta → BelongsTo → Unit

Then use eager loading to load them all at once:

User::find($user_id)->load('measurements.metas.unit')

Upvotes: 1

Related Questions