Где по гибридным отношениям (с) - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь добавить предложение where в мой существующий eloquent Builder. Запрос состоит из гибридного отношения между SQL и MongoDB.

Сборка таблицы SQL (класс сборки $ connection = 'mysql';)

+----+---------+--------------+-------------+----------+------------+
| id | user_id | commander_id | teamPerk_id | slot1_id | slot..._id |
+----+---------+--------------+-------------+----------+------------+
|  1 |       1 | Hero:xxxx    | Perk:xxxx   | Hero:xxx | Hero:xxx   |
+----+---------+--------------+-------------+----------+------------+

commander, teamPerk, slot1_id, slot ..._ id - это значения для mongoDB

class Build extends Model
{
    use HybridRelations;

    public function commander()
    {
        return $this->hasOne('\App\HeroesDB', 'gameName', 'commander_id');
    }

    public function teamPerk()
    {
        return $this->hasOne('\App\Perk', 'raw', 'teamPerk_id');
    }

    public function slot1()
    {
        return $this->hasOne('\App\HeroesDB', 'gameName', 'slot1_id');
    }

    public function slot...()
    {
        return $this->hasOne('\App\HeroesDB', 'gameName', 'slot..._id');
    }
}
class HeroesDB  extends Eloquent
{
    protected $connection = 'mongodb';
    protected $collection = 'Heroes';
    protected $fillable = ['*'];
}

Запрос без предложения where возвращает отношения коллекции Build (mongoDB) в teamPerk, commander, slot1-5

$data = BuildDB::with([
    'teamPerk',
    'commander', 'slot1', 'slot2', 'slot3', 'slot4', 'slot5',
    'user',
])->withCount([
    'votes',
    'votes as up_votes' => function ($query) {
        $query->where('type', 1);
    },
    'votes as down_votes' => function ($query) {
        $query->where('type', -1);
    },
])->orderBy(DB::raw('up_votes -down_votes'), 'desc')
    ->paginate(10);

Пример документа героя (HeroDB)

{
    "_id": "5c7c1cb5146bd81498007f8e",
    "gameName": "Hero:xxxx",
    "rarity": "legendary",
    "tier": "1",
    "class": "Commando",
    "perks": [
        {
          "name": "Some Perk",
        }
     ],
     "skills": [
        {
          "name": "Some Skill",
        },
     ],
     "translated": {
        "name": "Hero name",
     }
}

Вопрос заключается в том, как мне удается добавить к существующему запросу предложение where ex: Где perks.name = "Some Perk" или translation.name = "Имя героя"

Если вам требуется дополнительная информация, не стесняйтесь спрашивать. Моя попытка была добавить ->where('commander_id', '=', "Hero:xxxx") незадолго до ->paginate(), конечно, он будет работать, но я должен был бы указать точное "gameName", чтобы оно работало, но я не могу сослаться на него как где 'commander_id'.perks.name = "Some Perk" или любое другое поле сбора MongoDB.

...