web-dev-qa-db-ja.com

Drupalプライベートメッセージデータベーステーブルの設計

Drupal Privatemsgモジュールを実行しているインスタンス から生のメッセージデータを取得しようとしています。

メッセージデータをpm_messageおよびpm_indexテーブルまで追跡しましたが、データベースの構造/設計を理解するのに苦労しています。

メッセージの作成者と受信者のユーザーを取得しようとしていますが、ほとんどの場合、pm_message.authorpm_index.recipientはまったく同じユーザーです。データベースからメッセージの作成者と受信者を取得するにはどうすればよいですか?

これはおそらく、データベース設計のスレッドを理解していないため(thread_idの作成方法や関連性がわからないため)、データを取得するために実行しているサンプルクエリが原因です。

SELECT 
author, recipient, body, timestamp
FROM pm_message, pm_index
WHERE pm_message.mid = pm_index.mid
1
Tom

一般にDrupalを使用すると、自分でテーブルを作成しなかった場合にデータベースに直接クエリを実行することを避けたいと思います。代わりに、コアまたはモジュールによって提供される関数を使用してデータを取得してください。テーブル構造はしばしば複雑であり、予告なく変更される可能性がありますが、それらのテーブルにアクセスするための関数は一般に変更に適応します(これはcontribモジュールよりもコアに当てはまりますが、両方に当てはまります)。

Privatemsgの場合、Drupal 7バージョン(およびおそらく6)は、メッセージデータをプルするいくつかの便利な機能を提供します( メインモジュールファイルを参照 )。たとえば、 privatemsg_thread_loadでスレッド全体をロードできます:

/**
 * Load a thread with all the messages and participants.
 *
 * This function is called by the menu system through the %privatemsg_thread
 * wildcard.
 *
 * @param $thread_id
 *   Thread id, pmi.thread_id or pm.mid of the first message in that thread.
 * @param $account
 *   User object for which the thread should be loaded, defaults to
 *   the current user.
 * @param $start
 *   Message offset from the start of the thread.
 * @param $useAccessDenied
 *   Set to TRUE if the function should forward to the access denied page
 *   instead of not found. This is used by the menu system because that does
 *   load arguments before access checks are made. Defaults to FALSE.
 *
 * @return
 *   $thread object, with keys messages, participants, title and user. messages
 *   contains an array of messages, participants an array of user, subject the
 *   subject of the thread and user the user viewing the thread.
 *
 *   If no messages are found, or the thread_id is invalid, the function returns
 *   FALSE.

 * @ingroup api
 */
function privatemsg_thread_load($thread_id, $account = NULL, $start = NULL, $useAccessDenied = FALSE) {

privatemsg_sql_listのようなモジュールのデータをプルするためのクエリオブジェクトを生成する関数もいくつかあります。

/**
 * Query definition to load a list of threads.
 *
 * @param $account
 *  User object for which the messages are being loaded.
 * @param $argument
 *  string argument which can be used in the query builder to modify the thread listing.
 *
 * @see hook_query_privatemsg_list_alter()
 */
function privatemsg_sql_list($account, $argument = 'list') {
3
acrosman