samedi 8 décembre 2018

Using eloquent relation

I am trying to understand how to effectively use Eloquent relationships to have some high level functions in the model. I have a subscription app with 2 tables, 'users' and 'subscriptions'. This is a legacy system so I cannot just change things in any way I want.

 Table users (model App\User)
 id
 email
 active (0/1)
 join_date
 address etc
 phone

 Table subscriptions (model App\Subscription)
 id
 user_id
 box_id (what the person is subscribed to get)
 amount

Users are marked active or not active.

I would like to have a static method on the Subscription model that will give me all the active subscriptions. This data is then fed into other parts of the application.

This is derived by joining subscriptions to users and filtering based on the active column. The query is like this:

SELECT users.*, subscriptions.*
FROM subscriptions
JOIN users ON users.id = subscriptions.user_id
WHERE users.active = 1

Subscription model

class Subscription extends Model
{
    public static function allActive()
    {
        // This works except it doesn't use the eloquent relationship
        return static::where('users.active', 1)
            ->join('users', 'users.id', '=', 'subscriptions.user_id')
            ->select('users.*','subscriptions.*')
            ->get();
    }

    public function user()
    {
        return $this->belongsTo(User::class);
    }
}

User model

class User extends Authenticatable
{
    use Notifiable;
    public function subscriptions()
    {
        return $this->hasMany(Subscription::class);
    }
}

I would use it like this:

$subscriptions = \App\Subscription::allActive()->toArray();
print_r($subscriptions);

I have 2 questions.

  1. How do I rewrite the allActive function to use the relationship I already defined?

  2. In the returned data, how do I separate the columns from the two separate tables so that it is clear which table the data came from?



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire