Laravel Eloquent: 3 таблицы отношений - PullRequest
0 голосов
/ 22 января 2019

Я новичок в Laravel-eloquent, я хотел бы перевести этот SQL в режим Eloquent:

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

Где:

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');
    }
}

Мой контроллер, прекрасно работает с этим:

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

Но я не знаю, как подключиться к FirebaseTopics , чтобы продолжить сборку кода, будет полезна некоторая помощь.

1 Ответ

0 голосов
/ 22 января 2019

РЕДАКТИРОВАНИЕ ОТВЕТА!

Решение вашей проблемы заключается в использовании отношения hasOne вместо belongsTo в модели FirebaseUserTopics.Должно быть следующее:

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

Поскольку ваша модель FirebaseTopics не связана с моделью FirebaseUserTopics.Поле "ownTo" (которое используется для создания обратной связи) ищет поле firebase_topic_id в таблице firebase_topics, но это поле отсутствует в таблице firebase_topics.Вот почему вы должны относиться непосредственно, а не наоборот.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...