2017-04-12 11 views
0

は、私は、ユーザーがすべてのフィールドは、単純な整数(親と子の関係ですべてのアドレスが含まれているテーブルへの外部キー)であるアドレスをデータベースに格納する方法は?

area 
region 
city 
locality 
street 

アドレスを選択することができますlaravelアプリケーションを持っています。たとえば、領域testは8 regionsと2 citiesです。

この情報をmysqlデータベースに保存したいのですが、いくつか問題があります。

正常に機能し、すべてのモデルに対するすべての更新を処理するコードが多数あります(更新の差分で何が変更されたかに関する情報を保存します)。

5つの異なる列の場合にこれらのフィールドを保存すると、このコードはフィールドタイプ(テキスト、整数、選択)に依存するため、アプリケーションのさまざまな部分にコードを追加して(選択、更新、表示)これらの列を記述する別の設定があります)。これらのフィールドは、フィルタに使用され、時があるでしょうので

私は、その後、私は簡単に、このソリューションの速度に関する新しいcolumnsが、何を追加することができ、この

{"area": 10, "city": 335} 

のようなJSON形式のコラムでそれを保存したいですテーブル内で少なくとも50k行

答えて

0

Laravel は$モデルsee hereパラメータをキャスト使用します

protected $casts = [ 
    'address' => 'array', 
]; 

$record = SomeModel::find(1); 

// $address is an array... 
$address = $record->options; 

// address is automatically serialized back to JSON... 
$user->address = ["area" => 10, "city" => 335]; 
+1

Laravelは* cast *フィールドを内部的に管理し、JSONをテーブルからPHP配列として取り出し、PHP配列をJsonとして保存しますが、マイグレーションファイルではフィールドタイプがテキストであることを確認してください。 –

0

、あなたの住所の上にフィルタを持っている場合、そのHIGHLY彼らは様々な場所での変更が必要な場合でも、別の列にそれらを作ることをお勧めあなたのアプリケーションで。

フィルタでは、結果をフィルタリングしながら、areaが10などの行を取得するようにクエリを作成します。

データベースからの取得後にデータをフィルタリングする自由がある場合は、データ型textを使用してjson文字列をデータベースに格納し、データベースから取得した後に、とフィルタリングして除外します。

この最後のケースは実際にページ分割の結果を取り出してとした場合、が見つかりませんでした。

この場合、データベースごとに10行(または1ページに表示する結果の任意の数)をクエリし、検索後にフィルタリングし、制限を満たさない場合はさらにフェッチすることができます。さらなるクエリのためにオフセットを追跡します。

関連する問題