2

通知システムを開発しようとしていますが、特定の部分が正しく行われているかどうかわかりません。ケースを単純化するために、一般的な名前を使用します

システムの仕組み:

  1. 登録ユーザーは、データ テーブル グリッドから選択したフィルターに基づいて通知を受け取ることができます。(たとえば、アイテムの数量が X の場合に通知する、または set1.slug.quantity > X、some_value = false および some_int = 52 のように複数のフィルターを設定する)

そのような設定を保存する方法:

サンプルオブジェクト

"O:8:"stdClass":2:{s:9:"set1.slug";a:1:{s:3:"$eq";s:10:"item_slug1";}s:13:" set1.quantity";a:1:{s:4:"$gte";i:1;}}"

生成の簡素化

$object = new \stdClass();
$object->{'set1.slug'} = ['$eq' => 'item_slug1'];
$object->{'set1.quantity'} = ['$gte' => 1];
$object = serialize($object);

また、user_id と、フォームからシリアル化されたすべてのデータを部分的な MongoDB 生クエリに添付します。

データベースに保存されたオブジェクト - ユーザー用に設定された定義済みフィルター。Md は、アクセスと編集を容易にするためのオブジェクトの md5 ハッシュです。

+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+
| id |                                                     object                                                      | user_id |                md                |
+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+
|  1 | O:8:"stdClass":2:{s:9:"set1.slug";a:1:{s:3:"$eq";s:10:"item_slug1";}s:13:"set1.quantity";a:1:{s:4:"$gte";i:1;}} |      22 | d5003ba3227c4db3189827329815b053 |
+----+-----------------------------------------------------------------------------------------------------------------+---------+----------------------------------+

これが私がそれを使用する方法です-それがどのように機能するかについての私のビジョン。

テーブル Items にデータが入力されている間に、ループ内の API パーサーで findByFilterMD を呼び出します。

// MongoDB query ( items database )
protected function executeUserFilter($array)
{
    $list = Items::raw(function ($collection) use (&$array) {
        return $collection->find(
            $array, ["typeMap" => ['root' => 'array', 'document' => 'array']])
            ->toArray();
    });

    return $list;
}

// MySQL query - stored filters
protected function findByFilterMD($id)
{
    $user = Auth::user();
    $filter = PredefinedFilters::where('md', '=', $id)->first();
    $deserialize = unserialize($filter->object);

    $results = $this->executeUserFilter($deserialize);
    // here would probably be a notification function like pusher or onesignal
}

これを達成しようとする私の試みは完全に間違っている可能性があることを認識しており、一部のツールはすでにそれを行っている可能性があるため、車輪を再発明する可能性があります.

これは Item MongoDB オブジェクトの例です

{
    "_id": {
        "$oid": "5c0406abdc04e7007f17f4ef"
    },
    "name": "myObject",
    "inner_ID": "0db0b19a-9c01-4c21-8e10-6879dbcb37f1",
    "some_value": false,
    "some_int": 52,
    "set1": [
        {
            "slug": "item_slug1",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        },
    ],
    "set2": [
        {
            "slug": "item_slug2",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        },
        {
            "slug": "item_slug3",
            "quantity": 88,
            "extra": {
                "value": 0
            }
        }
    ],
    "expires": "2018-12-02 22:21:30"
}

ここに私の質問があります

  • このやり方は適切ですか?
  • 通知システムはどこで開始する必要がありますか? アイテムのAPIを解析する場所にあると思います。次に、ユーザーフィルターデータをループして、保存されたオブジェクトクエリを実行する必要があります-または、cronで呼び出される別のシステムにする必要がありますか?

私はどんな提案、再設計にもオープンです。

4

1 に答える 1