解決法
Issue with snake_case naming strategy
const SnakeNamingStrategy = require('typeorm-naming-strategies').SnakeNamingStrategy;
module.exports = {
type: "mysql",
host: "localhost",
port: 3306,
...
namingStrategy: new SnakeNamingStrategy(),
}
説明
以下のようなentityがあったとする。
import {Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn} from "typeorm";
import {User} from "./User";
@Entity()
export class Photo {
@PrimaryGeneratedColumn()
id: number;
@ManyToOne(type => User, user => user.photos, { eager: true })
@JoinColumn({ name: 'user_id' })
user: User;
}
---
import {Entity, PrimaryGeneratedColumn, Column, OneToMany} from "typeorm";
import {Photo} from "./Photo";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@OneToMany(type => Photo, photo => photo.user)
photos: Photo[];
}
このとき、photoRepository.findOne()
を実行すると、以下のようなクエリが実行されてDuplicate column name
のエラーが出てしまう。
SELECT DISTINCT ~略
FROM (SELECT `Photo`.`user_id` AS `Photo_user_id`,
`Photo_user`.`id` AS `Photo_user_id`,
~略
そこで、上記解決法にあるnamingStrategy
を導入することにより、以下のようなクエリが実行されるようになりエラーがでなくなる。めでたしめでたし。1
SELECT DISTINCT ~略
FROM (SELECT `Photo`.`user_id` AS `Photo_user_id`,
`Photo__user`.`id` AS `Photo__user_id`,
~略
参考
Duplicate alias names for different fields - Stack Overflow
Issue with snake_case naming strategy
-
0.3.0でデフォルトで対応する予定らしいが、該当issueが立てられたのは2018年5月。いつになることやら… ↩