Güncelleme yaparken varolan bir post u db den alıp güncelliyorsun ama aşağı ki satırlar da yeni postmeta klası dolayısı ile db ye de yeni postmeta alanı ekliyorsun, eklerken PostMeta.postId satırını kullanmıyorsunuz ($modelPostMeta[] = new PostMeta( array( 'metaKey' => $key, 'metaValue' => $value ) );)
bu da eklenecek alan foreing olduğu için hata verme sebebidir, yni ortada bir foreing key var ama tanımlanmıyor, yani postmeta eklerken, ilgili postmeta'nın hangi post a ait olduğu
PostMeta.postId alanına eklenecek $post->id ile tanımlanmalı fakat siz bu eklemeyi yapmadığınızdan foreing key hata veriyor.
ayrıca güncelleme işlemin de metaların da kontrol edilip varolanların düzenlenmesi olmayanların eklenmesi gerekir, siz doğrudan yeni eklemeler yapıyorsunuz bu da aynı metaların tekrar tekrar eklenmesine (unique alan varsa (key, value) hata vermesine) sebep olabilir.
foreach ( $postMeta as $key => $value ) {
$modelPostMeta[] = new PostMeta( array( 'metaKey' => $key, 'metaValue' => $value ) );
}
bölümünü kullanmadan önce
$post->postMeta() diyerek ilişkili tablodan metaları çekip olanları güncelleme olmayanları ekleme şeklinde düzenlemek sorununuzu çözebilir.
Projenizi incelemedim bunlar sadece ilk izlenimlerim, yanlış anladıysam kusura bakmayın.