4
1

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 1 year has passed since last update.

Laravelのeloquentでjoinしたときに同じカラム名でバグる可能性

Posted at

aテーブルのid=1

bテーブルのid=2でa_id=1だとして、
これをjoinすると

$a = A::join('b', 'a.id', '=', 'b.a_id')->first();

とする。

このとき

$a->id; // 2

となる現象が起きました。
同じidというカラム名だからっぽいです。
このままだとidをキーにするのでリレーションで辿るデータなどがうまくとれないなど発生します。
知らないと結構やらかしそうな内容です。

回避は

$a = A::select('*', 'a.id as id')->join('b', 'a.id', '=', 'b.a_id')->first();

とかですね。
あとはこれを起こさないためのグローバルスコープなんかもissueに書かれてました。

trait OnlyMyColumnsTrait
{
    public static function bootOnlyMyColumnsTrait()
    {
        static::addGlobalScope('only_my_columns', function (Builder $builder) {
            $builder->select($builder->getModel()->getTable().'.*');
        });
    }
}

4
1
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?