2017-01-06 24 views
0

私はユーザーが新しいアカウントを作成してプロフィール写真をアップロードできるシステムを開発しています。私は2つのモデルを使用しています:Userアカウント、Photo写真。CakePHP 3.x新しいレコードだけでなく関連する新しいレコードを保存する

テーブルにはの外部キーがあり、photos.idを参照しています。 photosテーブルには、users.idを参照する外部キーを持つuserIdフィールドがあります。だから、ユーザーと写真の間に再帰的な関係があります。この理由:Photoが作成されたときに、UserPhotoをアップロードしたことがわかります。 Userには、プロフィール画像としてPhotoが1つあります。

ですので、Photo hasOne UserUser hasOne Photoです。これらは、テーブルクラスでもこのように構成されています。

新しいUserが保存されたら、新しいPhotoも保存します。 Photoは、保存するために新しく作成されたUserのIDが必要ですが、Userには新しく作成されたIDであるPhotoが必要です。

私の質問:これを保存する最も良い方法は何ですか? User.photoIdをヌルにして、最初にユーザを保存してから写真を保存し、次にユーザに正しいPhoto.idを更新させるか、CakePHP3があなたのために前後にリンクするすべてのマジックを行うことができるようにする必要があります?

形から来ているデータ:

[ 
    'username' => 'John Doe', 
    'mail' => '[email protected]', 
    'password' => 'whatever', 
    'photo' => [ 
     'name' => 'myImage.jpg', 
     'type' => 'image/jpeg', 
     'tmp_name' => '/private/var/tmp/phpN3dVmL', 
     'error' => (int) 0, 
     'size' => (int) 40171 
    ] 
] 

答えて

0

またはCakePHP3が、それはこのすべてがあなたのために前後に結ぶんいくつかの魔法を行うことができますか?

はい!あなたの団体が正しく設定されている限り、Cakeは残りの世話をします。したがって、データ配列をnewEntityまたはpatchEntityに渡し、渡されたすべてのフィールドがエンティティでアクセス可能であることを確認するのが最善の方法です。

Saving hasOne relationships

Entities and mass assignment

+0

は、私は、CakePHPは自動的にhasOneの関係を処理することを承知しているが、実体「を有するが、」第二のエンティティがすでに存在する場合にのみ(他のモデルは、その外部キーとして持つことができ、IDがありますので)それはです。しかし、両方のエンティティが新しい(まだIDを持っていない)ときに何をすべきか? – Koen

+0

それにも注意してください。 – cjquinn

1

物事を簡単に!

なぜ両方のテーブルにhasOne関係が必要ですか?

あなたはそのことについてcomplected.Letの話ので、簡単なものを作っているように見えます:

You have two tables users and photos that's fine. 
At the moment each user has one photo that's fine as well. 

ちょうどその時、一日の利用者が複数の写真を持っているかもしれないと想像?

Then still no worries, everything would be good because you have photos table already. 

ここで実際にどのような関係が必要ですか?

Just like mentioned above, user has one photo, That's why relation should be: 
user hasOne photo and obviously photo belongsTo user. 

それ以上のものは必要ありません。ユーザーテーブルの上に

ただ、例えば

フィールド写真テーブル上

id 
name 
email 
address 
has_photo // eg:if has_photo = 1 user has uploaded photo,such field is not compulsary 
password...etc 

フィールド

id 
user_id // foreign key of users table 
name 
size 

関係

// UsersTable.php 
    $this->hasOne('Photos', [ 
     'foreignKey' => 'user_id' 
    ]); 

// PhotosTable.php 
    $this->belongsTo('Users', [ 
     'foreignKey' => 'user_id', 
     'joinType' => 'INNER' 
    ]); 

user_id..usersテーブルが必要であることを混同しないでください。ユーザーテーブルが写真テーブルに既に関連付けられているため、ユーザーテーブルは必要ありません。 A hasOne Bならば、Bは明らかにAに属します。単純なロジックです。

関係についての詳細を知ることをためらってください( Associations )。これはデータベース管理にとって本当に重要なことです。

+0

ポイントは、 'Photos'は複数のモデルと複数の関係を持つということです。 1つの「写真」で1つの「ユーザー」を取得したいと考えています。したがって、 'User hasOne Photo'。しかし、記事には、記事がある写真を表示することができるように、多くの写真があります。そして、「ユーザー」はこれらの「写真」をすべてアップロードするので、「写真hasOneユーザー」となります。 – Koen

+0

あなたの問題は何ですか?記事にも多くの写真がある場合、その関係もあまりにもあります。 –

+0

しかし、それは写真のhasOneユーザーです。新しいユーザーで新しいユーザーを保存すると、写真のユーザーIDが自動的に入力されません。 – Koen

関連する問題