もう一度、Elixirの基本的な知識とEctoの基本が想定されています。これについては、ElixirのEcto Libraryの紹介で取り上げられています。
キーテイクアウト
参加は、クエリするときはかなり基本的ですが、それでも今はそれらをカバーしているだけです。この理由は、Ectoだけで参加することについて学ぶことが役に立たないためです。同様に関連についても知る必要があります。これらについては学ぶのは難しくありませんが、これまでにカバーされている他のトピックほど些細なことではありません。 簡単に言えば、アソシエーションにより、開発者はモデル内のテーブル関係(外部キーとして実装)を処理できます。それらは、has_one/3およびhas_many/3マクロ(他のモデルを含むモデル用)を使用して各モデルのスキーマで定義され、belbings_to/3マクロ(他のモデルの範囲であるモデル - 外部キーを持つモデル) 。
ectoingアプリケーションを見ると、ectoing.userモデルとectoing.messageモデルの間の関連性の1つの例を見ることができます。 ectoing.userで定義されているスキーマは、次の関連付けを定義しています:
1人のユーザーが多くのメッセージ(ectoing.message)を持っていることがわかります。この協会を呼び出しています。メッセージ。
ここで、モデル、ectoing.messageはectoing.userモデルに属していると言っています。また、協会を以下と名付けました。デフォルトでは、ECTOは_IDをBENBSS_TO ASSOACITION名に追加し、それを外部キー名として使用します(ここでは、user_idになります)。このデフォルトの動作は、foreign_keyオプションを指定することにより、外部キー名を手動で指定することでオーバーライドできます。たとえば、
ここで、参加を使用してユーザーとそのメッセージを取得する簡単なクエリを見てみましょう。
offset <span>= 0 </span>username <span>= <span>"%tp%"</span> </span> <span># Keywords query syntax </span>get_users_overview <span>= from u in Ectoing.User, </span> <span>select: [u.id, u.username] </span> search_by_username <span>= from u in get_users_overview, </span> <span>where: like(u.username, ^username) </span> paginate_query <span>= from search_by_username, </span> <span>limit: 10, </span> <span>offset: ^offset </span> <span># Macro syntax </span>get_users_overview <span>= (Ectoing.User </span><span>|> select([u], [u.id, u.username])) </span> search_by_username <span>= (get_users_overview </span><span>|> where([u], like(u.username, ^username))) </span> paginate_query <span>= (search_by_username </span><span>|> limit(10) </span><span>|> offset(^offset)) </span> Ectoing<span>.Repo.all paginate_query </span>
返された値:
has_many <span>:messages, Ectoing.Message </span>
注目すべきことに、メッセージ協会を含む多くのアンロードされた関連付けがあります。この関連付けの読み込みは、クエリの結果セットから、またはクエリ自体からの2つの方法のいずれかで実行できます。結果セットからのロード関連は、repo.preload関数を使用して実行できます:
belongs_to <span>:user, Ectoing.User </span>
<span># Ectoing.Message </span>belongs_to <span>:user, Ectoing.User, foreign_key: some_other_fk_name </span>
<span>SELECT * FROM users u INNER JOIN messages m ON u.id = m.user_id WHERE u.id = 4; </span>
<span># Keywords query syntax </span>query <span>= from u in Ectoing.User, </span> <span>join: m in Ectoing.Message, on: u.id == m.user_id, </span> <span>where: u.id == 4 </span> <span># Macro syntax </span>query <span>= (Ectoing.User </span><span>|> join(:inner, [u], m in Ectoing.Message, u.id == m.user_id) </span><span>|> where([u], u.id == 4)) </span> Ectoing<span>.Repo.all query </span>
(上記にはMySQL固有のSQLが含まれています。別のデータベースを使用している場合、これは機能しません。
<span>SELECT id, username FROM users; </span><span>SELECT id, username FROM users WHERE username LIKE "%tp%"; </span><span>SELECT id, username FROM users WHERE username LIKE "%tp%" LIMIT 10, 0; </span>
offset <span>= 0 </span>username <span>= <span>"%tp%"</span> </span> <span># Keywords query syntax </span>get_users_overview <span>= from u in Ectoing.User, </span> <span>select: [u.id, u.username] </span> search_by_username <span>= from u in get_users_overview, </span> <span>where: like(u.username, ^username) </span> paginate_query <span>= from search_by_username, </span> <span>limit: 10, </span> <span>offset: ^offset </span> <span># Macro syntax </span>get_users_overview <span>= (Ectoing.User </span><span>|> select([u], [u.id, u.username])) </span> search_by_username <span>= (get_users_overview </span><span>|> where([u], like(u.username, ^username))) </span> paginate_query <span>= (search_by_username </span><span>|> limit(10) </span><span>|> offset(^offset)) </span> Ectoing<span>.Repo.all paginate_query </span>
ただし、ecto.date structをecto.dateTime structにキャストできないため、これはecto.casterrorを提供します(補間ecto.date式をタイプecto.datetimeのフィールドと比較しているため)。この場合、ecto.datetime structを構築するか、ecto.dateTimeの代わりにecto.dateに式をキャストしたいことをectoに指定することができます。
クエリを一緒に作成することから例に戻りましょう。ここでは、ユーザー名検索を実行しました。
<span>SELECT id, username FROM users; </span><span>SELECT id, username FROM users WHERE username LIKE "%tp%"; </span><span>SELECT id, username FROM users WHERE username LIKE "%tp%" LIMIT 10, 0; </span>
フィールド/2関数は、フィールドを動的に指定する必要がある場合に使用されます。その最初の議論は、アクセスするフィールドの表であり、2番目の引数は、アトムとして指定されたフィールドの名前自体です。上記のような一般的なクエリを使用して、関数内でそれをカプセル化し、パラメーターを使用して、指定されたクエリで指定されたテーブルから特定のフィールドを検索できます。
offset <span>= 0 </span>username <span>= <span>"%tp%"</span> </span> <span># Keywords query syntax </span>get_users_overview <span>= from u in Ectoing.User, </span> <span>select: [u.id, u.username] </span> search_by_username <span>= from u in get_users_overview, </span> <span>where: like(u.username, ^username) </span> paginate_query <span>= from search_by_username, </span> <span>limit: 10, </span> <span>offset: ^offset </span> <span># Macro syntax </span>get_users_overview <span>= (Ectoing.User </span><span>|> select([u], [u.id, u.username])) </span> search_by_username <span>= (get_users_overview </span><span>|> where([u], like(u.username, ^username))) </span> paginate_query <span>= (search_by_username </span><span>|> limit(10) </span><span>|> offset(^offset)) </span> Ectoing<span>.Repo.all paginate_query </span>
ectoは、has_many、has_one、およびbelunks_to macrosを使用して、テーブル間の関連性を定義する方法を提供します。これらの関連性により、関連するデータを便利で効率的な方法で照会することができます。たとえば、ユーザースキーマがあり、各ユーザーに多くの投稿がある場合、簡単なクエリを持つユーザーのすべての投稿を取得できます。 ? ectoは、単一のトランザクションで複数の操作を実行できるRepo.Transaction関数を提供します。操作が失敗した場合、トランザクション内で行われたすべての変更がロールバックされます。これにより、データの一貫性と整合性が保証されます。はい、Ectoは、結合、サブクリーリー、集約など、幅広いクエリ操作をサポートしています。結合キーワードを使用して、テーブルを結合し、キーワードからサブクエリを作成し、sum、avg、min、maxなどの機能を作成して集約を実行できます。これにより、Ectoは複雑な方法でデータを照会するための強力なツールになります。
ECTOはトランザクションをどのように処理しますか?
ectoは最初にPostgreSQLで動作するように設計されていましたが、MySQLやMySQLなどの他のデータベースもサポートしています。 sqlite。 ECTOリポジトリをセットアップするときにデータベースタイプを指定できます。
以上がElixir&#x27; s cecto querying dsl:beyond the basicsの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。