2017-05-03 23 views
0

私はモデルがあります:ArtObjectsと写真:Laravel雄弁 - 1つのリレーションに多く

class Photo extends Model 
{ 
    protected $fillable = ['caption','description','alternative_text']; 

    public function artObject() 
    { 
     return $this->belongsTo('App\ArtObject'); 
    } 
} 

class ArtObject extends Model 
{ 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = [ 
     'title', 
     'description', 
     'rating', 
     'popularity', 
     'type', 
     'price' 
    ]; 

    public function photos() 
    { 
     return $this->hasMany(ArtObjectPhoto::class); 
    } 
} 

コントローラ:

ArtObjectコントローラ:

public function store(ArtObjectUploadRequest $request) 
{ 
    $art_object = ArtObject::create(request(['title', 'description', 'rating', 'popularity', 'type', 'price'])); 

    $this->validate($request, [ 
     'title' => 'required', 
     'description' => 'required' 
    ]); 

    foreach ($photo_ids = Input::get('photos') as $photo_id) { 

     $photo = Photo::find($photo_id); 

     /* 
     Problem is here - The user wants to attach the selected photos with 
     the art-object, ........ Please advise, thanks in anticipation !!! 
     */ 

    } 

    //save the artobject to the database 
    $art_object->save(); 

    //And redirect to the home page 
    return redirect('/'); 
} 

問題:ユーザーが選択した添付したいのかをアートオブジェクトとの写真。写真はすでにdbに存在することに注意してください。私はオプションを試してみました - save()、associate()は何も助けませんでした。私の理解は、私が$ art_objectを使って()を保存できるはずの写真オブジェクトを見つけなければならないと、私が一度見つけた写真です。私はnew()を使い、DBから割り当ててPhotoオブジェクトに代入したいと思っています。しかし、私はこれが正しいことだとは思わない。私はこれが多対一関係を実装する最善の方法ではないと考えています。そして、この関係を保存する最良の方法は何ですか。ご助言をいただき、ありがとうございます!

答えて

1

データベースの多対1リレーションシップルールによれば、テーブルを接続する外部キーは、常に「多数」の関係を持つテーブルに保存されます。

このように、1つのArtObjectは多くのPhotosを持つことができます。つまり、「多くの」テーブルはPhotosです。写真モデルには、外部キーとしてart_object_idという名前の属性が必要です。

次に、ArtObjectオブジェクトを最初に保存し、このオブジェクトのIDを、ユーザーがIDを選択したすべての行の写真テーブルに保存する必要があります。

$art_object = ArtObject::create(request(['title', 'description', 'rating', 'popularity', 'type', 'price'])); 

$this->validate($request, [ 
    'title' => 'required', 
    'description' => 'required' 
]); 

//save the artobject to the database 
$art_object->save(); 

foreach ($photo_ids = Input::get('photos') as $photo_id) { 

    $photo = Photo::find($photo_id); 
    $photo->art_object_id = $art_object->id; 
    $photo->save(); 


} 

は、これを実行した後、あなたはtogether.Youも定義されたことにより、ArtObjectに関連した写真を取得することができArtObjectや写真のテーブルを関連付けるために写真のモデルで定義された方法により、写真の関連ArtObjectを取得することができますArtObjectのメソッドArtObjectモデルで

: - 写真のモデルで

public function photos() 
{ 
    return $this->hasMany('App\Photo'); 
} 

: -

public function artObject() 
{ 
    return $this->belongsTo('App\ArtObject'); 
}