[https://readouble.com/laravel/5.4/ja/eloquent-relationships.html#has-many-through:title] 5.4公式サイトの表記

リレーションのクエリ実行時は、典型的なEloquentの外部キー規約が使用されます。リレーションのキーをカスタマイズしたい場合は、hasManyThroughメソッドの第3引数と、第4引数を指定してください。第3引数は仲介モデルの外部キー名、第4引数は最終的なモデルの外部キー名です。そして第5引数はローカルキーです。

[https://readouble.com/laravel/5.5/ja/eloquent-relationships.html#has-many-through:title] 5.5公式サイトの表記

リレーションのクエリ実行時は、典型的なEloquentの外部キー規約が使用されます。リレーションのキーをカスタマイズしたい場合は、hasManyThroughメソッドの第3引数と、第4引数を指定してください。第3引数は仲介モデルの外部キー名、第4引数は最終的なモデルの外部キー名です。第5引数はローカルキーで、第6引数は仲介モデルのローカルキーです。

しかしながら、この通りに実装しても全然値が取れない。
実はこれ、第6引数までとるみたい…

<?php

class First extends Model {
    public function Third()
    {
        return $this->hasManyThrough(
            'App\Third', 'App\Second',
            'C_id', 'A_id', null, 'B_id'
        );
    }
}

上記のような「FirstクラスからSecondクラスを経由してThirdクラスのデータを取得したい」場合、
hasManyThroughメソッドに渡す引数は順に、

  • 最終的にデータを取得するクラス(Third)…‘App\Third’
  • 経由するクラス(Second)…‘App\Second’
  • 経由するクラス(Second)と呼び出し元(First)を繋ぐキー…‘C_id’
  • 呼び出し元(First)のマスターキー…‘A_id’
  • よくわからないやつ👹 呼び出し元(First)のローカルキー…null
  • 経由するクラス(Second)と最終的にデータを取得するクラス(Third)を繋ぐキー…‘B_id’ となる。

5番目の「よく分からないやつ」「呼び出し元(First)のローカルキー」にはnullを渡すとうまくいった…これはいったいなんなのか???
これ、指定しなくてもいいんだねぇ……謎

😱💬 最初はこういう書き方してたせいで結果が0件だった.
    そりゃ経由するクラス(Second)と最終的にデータを取得するクラス(Third)を繋ぐキーがなければ結果が出るはずもないよね. 反省.

<?php

class First extends Model {
    public function Third()
    {
        return $this->hasManyThrough(
            'App\Third', 'App\Second',
            'C_id', 'A_id', 'B_id'
        );
    }
}

😭💬 教訓:ちゃんとバージョンにあったドキュメント読みましょうね.