nodejs + knex + bookshelf (typescript)で、ブログのバックエンドのようなものを作っています。
ブログでよくある「特定のタグを含むエントリー」を一覧で取得したいのですが、タグとエントリーは中間テーブルで関連を定義していて、こういった場合の検索方法が分からず困っています。
bookshelfを使ってリレーション先を展開する事は出来たのですが…
テーブルの構成と、Bookshelfでのテーブル定義は以下の通りです。
テーブルとその構成
entry - id - content - author tag - id - name entry_tag - id - entry - tag
Bookshelfで定義したモデル
インポートは省略しています。
tag.ts
typescript
1export default class Tag extends bookshelf.Model<Tag>{ 2 get tableName(){return "tag";} 3}
tag_entry.ts
typescript
1export default class EntryTag extends bookshelf.Model<EntryTag>{ 2 get tableName(){return "entry_tag";} 3}
entry.ts
typescript
1export default class Entry extends bookshelf.Model<Entry>{ 2 3 get tableName(){return "entry";} 4 tags(){ 5 return this.belongsToMany(Tag, "entry_tag", "entry", "tag", "id", "id"); 6 } 7 8}
試してみたコード
entry.ts内で作っているtagsに対して検索をかけてみているのですが、
typescript
1let model=new Entry(); 2model.where("tags", 1).fetchAll({withRelated:["tags"]}).then(v=>{ 3 console.log(v); 4}).catch(e=>{ 5 console.log(e); 6})
(当然?)そんなカラムはありませんと怒られてしまいます。
{ Error: SQLITE_ERROR: no such column: tags errno: 1, code: 'SQLITE_ERROR' }
直接sqlを発行?
以下の記事を見るとsql的にベストプラクティスがあるようなのですが、これをBookshelfを用いて実行する方法が分かりません。
https://qiita.com/ak-ymst/items/506ae4f176596488d1ac
knex等を使用してsqlを発行する事は出来ると思うのですが、そうするとリレーションの展開を結局自力でやる必要が出てきて、bookshelfを使用しているメリットが生かせなそうだなと思っています。
以上になります。
宜しくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。