1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravel5でhasManyThroughを使うと仲介するテーブルのIDが取得データに追加される

Posted at

hasManyThroughを使った際に思わぬ動作で対処方法が思いつかずQiitaに投稿

users 投稿者
 id

posts 記事
 id
 user_id

comments コメント
 id
 post_id 記事ID
 user_id 投稿者ID

このTable構成でユーザーが作成した記事のコメント一覧を取得する時
users->posts->commentsのデータを
hasManyThroughを使えば一気に取得することができました・・・が

comments内のuser_idについてpostsのuser_idで上書きされるという現象が・・・

ソースコードの中を探していくと
get,paginate,simplePaginate中のselectを設定するところで下記の関数を使っている為
末尾にどうしても仲介するテーブルのIDが付与される形に

/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Relations/HasManyThrough.php
protected function getSelectColumns(array $columns = ['*'])
{
    if ($columns == ['*']) {
        $columns = [$this->related->getTable().'.*'];
    }
    return array_merge($columns, [$this->parent->getTable().'.'.$this->firstKey]);
}

もともとの親自体はqueryを発行する前に取得できているだろうと思うので
なぜわざわざデータ取得時にフィールドを末尾に追加しているのかわかりませんでした。
とりあえずこいつがあるせいで
上記のテーブルではcommentsないのuser_idがpostsのuser_idで上書きされてしまいます。

とりあえずの現状の対応として
1.listsでidだけ一度取得して
そのidを元に各データ(comments)を取得しなおす

2.getSelectColumnsの末尾にidを追加しているところさえ消せば
不要な情報が追加されず動作するので該当部分を消す?

他に方法を知っている方が入れば教えて頂きたいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?