ZiTAL
ZiTAL

Reputation: 3581

Laravel Eloquent: 3 table relationship

I'm new to Laravel-eloquent, I would like to translate this SQL to Eloquent mode:

select
    fl.id, fut.id, fut.firebase_topic_id, ft.id, fl.created_at
from
    firebase_logs fl,
    firebase_user_topics fut,
    firebase_topics ft
where
    fl.id = fut.firebase_log_id
    and
    fut.firebase_topic_id = ft.id
    and
    fl.created_at between '2019-01-09 16:33:39' and '2019-01-09 16:33:41'
    and
    ft.id = 1
    order by fl.created_at asc

Where:

Firebase_logs.id (1) -> Firebase_user_topics.firebase_log_id (N)
and
Firenase_user_topics.firebase_topic_id (N) -> Firebase_topics.id (1)

FirebaseLog.php:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class FirebaseLog extends Model
{
    public $incrementing = false;
    protected $primaryKey = 'id';

    public function user_topics() {
        //return $this->hasManyThrough(FirebaseTopics::class, FirebaseUserTopics::class);
        return $this->hasMany(FirebaseUserTopics::class);
    }
}

FirebaseUserTopics.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class FirebaseUserTopics extends Model
{
    protected $table = 'firebase_user_topics';

    public function log()
    {
        return $this->belongsTo(FirebaseLog::class);
    }

    public function topic()
    {
        return $this->belongsTo(FirebaseTopics::class);
    }    
}

FirebaseTopics.php

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class FirebaseTopics extends Model
{
    protected $table = 'firebase_topics';

    public function user_topics()
    {
        return $this->hasMany(FirebaseUserTopics, 'firebase_user_topics');
    }
}

My Controller, works fine with this:

$a = FirebaseLog::with('user_topics')->whereBetween('created_at', array('2019-01-09 16:33:39', '2019-01-09 16:33:41'))->get(); 
return $a;

But I don't know how to connect to FirebaseTopics to continue building the code, some help will be appreciated.

Upvotes: 0

Views: 106

Answers (1)

FGDeveloper
FGDeveloper

Reputation: 1050

EDITED ANSWER!

The solution of your problem is use the hasOne relation instead of belongsTo in your FirebaseUserTopics model. It must be following;

public function topic()
{
    return $this->hasOne(FirebaseTopics::class, 'id', 'firebase_topic_id');
}

Because your FirebaseTopics model has not a relation with FirebaseUserTopics model. The "belongsTo" (that uses to make reverse a relation) search firebase_topic_id field in the firebase_topics table but this field has no in the firebase_topics table. That's why, you must be make to relation directly, not reverse.

Upvotes: 1

Related Questions