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が付与される形に
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を追加しているところさえ消せば
不要な情報が追加されず動作するので該当部分を消す?
他に方法を知っている方が入れば教えて頂きたいです。