問題タブ [revisionable]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
3 に答える
6608 参照

php - Laravelでモデルリビジョンを実装するにはどうすればよいですか?

この質問は、PHP で記述された私の Pastebin アプリに関するものです。

少し調べてみましたが、自分のニーズに合った解決策を見つけることができませんでした。この構造のテーブルがあります:

これは、ペーストビン アプリケーション用です。私は基本的にリビジョンを貼り付けたいので、ペースト #1234 を開くと、そのペーストの過去のリビジョンがすべて表示されます。

次の3つの方法を考えました。

方法 1

id と old_id などを含むリビジョン テーブルがあり、各 ID に対してすべての古いリビジョンを挿入するので、私の構造が次のようになっている場合:

テーブルには次のデータが含まれます。

これで私が抱えている問題は、多くの重複データが導入されることです。そして、リビジョンが増えれば増えるほど、データが増えるだけでなく、リビジョン テーブルに新しい貼り付けを行うたびに N 個の挿入を行う必要があり、大きな N には適していません。

方法 2

一番上の貼り付けテーブルに child_id を追加して、それを更新するだけです。そして、ペーストをフェッチするときに、各 child_id とその child_id などについてデータベースにクエリを実行し続けます...しかし、問題は、多くのリビジョンを持つペーストが開かれるたびに、あまりにも多くの DB 読み取りが発生することです。

方法 3

別のリビジョン テーブルも必要ですが、方法 1 と同じシナリオでは、次のようにデータを格納します。

そして、だれかがペースト 1234 を開いたときに、IN 句を使用して、そこにあるすべての子ペースト データを取得します。

最適なアプローチはどれですか? または、より良いアプローチがありますか?Eloquent ORM を備えた Laravel 4 フレームワークを使用しています。

編集:oneToMany関係で方法1を実行できますか? Eager Loadingを使用してすべてのリビジョンをフェッチできることは理解していますが、ダーティー ハックを行わずにそれらを挿入するにはどうすればよいでしょうか?

編集:上記の処理方法を理解しました。この質問を閉じるために回答を追加します。

0 投票する
3 に答える
21476 参照

php - Laravel で複数のクラスを拡張する

Php は複数のクラスを拡張することをネイティブに許可していないため、行き詰まっています。laravel モデルを使用してデータを操作しており、2 つの異なるパッケージを使用してその機能を拡張したいと考えています。

Ardentバリデーターと更新履歴を保持するRevisionableを使用しようとしていますが、モデル内でこれら 2 つのクラスを拡張する方法がわかりません。

どんな助けでも大歓迎です。

0 投票する
2 に答える
1355 参照

php - 特徴 'Venturecraft\Revisionable\RevisionableTrait' が見つかりません

私はlaravel 4を使用しており、テーブルに対して行われたすべてのトランザクションの履歴を追跡したいと考えています. 私はそれらの手順に従いました

  1. "venturecraft/revisionable": "1.*"composer.json に追加
  2. php composer.phar update
  3. 私のプロジェクトのルートでこれを実行します:

    php artisan migrate --package=venturecraft/revisionable

「移行するものはありません」と表示されます

次に、アプリ/データベースフォルダーのパッケージから移行ファイルをコピーし、クラス名を CreateRevisionsTable から CreateRevisionTable のようなものに変更すると、データベースにテーブルが作成されました。次に、これを Car モデルに追加しました。

1.

次に、私のコントローラーで:

そして、私の見解では:

composer.json

結果は次のとおりです。

私は何が欠けていますか?

0 投票する
2 に答える
976 参照

php - 自分の特性をクラスに拡張するにはどうすればよいですか

定義上、特性はクラスを拡張できないことは理解していますが、何らかの回避策があるかどうか疑問に思っています。

私の状況:

私はパッケージ Revisionable を作成しました。最初の化身は、 Laravelsベースの Eloquent クラスを拡張したモデルから拡張したクラスでしたが、時間の経過とともに、これをトレイトに変更するという多くの要求があったため、人々はuse改訂可能になり、独自の基本クラスを拡張できます。

現在、拡張可能なクラスとトレイトの両方を許可すると考えることができるのは、両方をファイル全体として提供することだけです。つまり、コード全体を2つのファイルで繰り返しているため、後で問題が発生しやすくなります。 .

神であるファイルを1つ持つことができ、他のファイルがそれに依存している解決策を誰かが知っているかどうか疑問に思っています。

ルール

  • PHP 5.3 のパッケージの既存のユーザーは特性にアクセスできないため、既存のクラスは特性を使用できません。
0 投票する
1 に答える
661 参照

php - モデルで `boot()` を使用すると RevisionableTrait と競合します

私のlaravelアプリでRevisionableパッケージを使用して、編集をモデルに記録しています。

さらに、特定のモデル イベント (更新、削除、作成など) をリッスンし、アクション (キャッシュのクリアなど) を実行するオブザーバー クラスも実装しました。このオブザーバーは、boot()次のメソッドを使用してモデルでインスタンス化されます。

私が見つけたのはboot()、モデルでメソッドを定義すると、改訂可能な特性が機能しなくなり、変更をログに記録しないことです-おそらくboot、モデル内のメソッドによってオーバーライドされているメソッドも使用しているためです。

モデルイベントをリッスンし、改訂可能なパッケージを利用できるようにするには、これをどのように修正すればよいですか?

0 投票する
1 に答える
456 参照

php - モデル "identifiableName()" をリビジョンから取得する

リビジョン可能なパッケージではidentifiableName()、id の代わりに表示するフィールドを設定して、モデルのメソッドを定義することにより、関連するモデルの識別可能な名前を取得でき ます。例: 「名前」または「タイトル」。

無関係なモデルで同様のことを行うことは可能ですか。たとえば、特定のモデルのすべてのリビジョンを取得したとします。例えば

各リビジョンが作成されたidentifiableNameのを取得するにはどうすればよいですか?post

私はすでに投稿IDを取得できますが、大きなリビジョンのリストでは費用がかかる$revision->revisionable_idようなものなしでは、投稿名を取得する方法を見つけることができないようです.Post::find($revision->revisionable_id)->name