Larravel 5에서 Expellent를 사용하여 피벗 테이블을 업데이트하는 방법
저는 래라벨이 처음입니다.저는 라라벨 5 앱을 만들고 있는데 여기에 갇혀있습니다.저는 다음과 같은 두 가지 모델을 가지고 있습니다.
class Message extends Eloquent{
public function user()
{
return $this->belongsTo('App\User', 'from');
}
public function users()
{
return $this->belongsToMany('App\User')->withPivot('status');
}
}
class User extends Eloquent {
public function messages()
{
return $this->hasMany('App\Message', 'from');
}
public function receive_messages() {
return $this->belongsToMany('App\Message')->withPivot('status');
}
}
Message와 User 사이에는 다음과 같은 피벗 테이블이 있습니다.
Table Name: message_user
Colums:
message_id
user_id
status
다음과 같은 SQL 쿼리가 있습니다.
update message_user
set status = 1
where user_id = 4 and message_id in (select id from messages where message_id = 123)
이 질의를 어떻게 래브라도 등가물로 번역할 수 있습니까?
아래 코드를 통해 내 문제가 해결되었습니다.
$messages = Message::where('message_id', $id)->get();
foreach($messages as $message)
$message->users()->updateExistingPivot($user, array('status' => 1), false);
이 두 가지 기능 중 하나를 사용해도 좋습니다.sync()
attach()
간단히 말하면, 동기화가 첫 번째 인수로 배열을 얻고 피벗 테이블(배열에서 전달된 키를 제거하고 추가)과 동기화한다는 차이점이 있습니다. 즉, 연결 테이블 내에서 3,2,1 값을 얻고 3,4,2 값과 전달된 동기화를 수행하면 자동으로 1 값이 제거되고 4 값이 추가됩니다.여기서 Attach는 단일 ID 값을 사용합니다.
GIST: 연결 테이블에 추가 값을 추가하려면 두 번째 인수로 전달합니다.sync()
다음과 같습니다.
$message = Messages::find(123);
$user = User::find(4);
// using attach() for single message
$user->message()->attach($message->id, [
'status' => 1
]);
$message2 = Messages::find(456); // for testing
// using sync() for multiple messages
$user->message()->sync([
$message->id => [
'status' => 1
],
$message2->id => [
'status' => 1
],
]);
피벗 테이블 열을 업데이트하는 방법의 작은 예는 다음과 같습니다.
$query = Classes::query();
$query = $query->with('trainees')
->where('user_id', Auth::id())
->find($input['classId']);
foreach ($query->trainees as $trainee) {
$trainee->pivot->status = 1 //your column;
$trainee->pivot->save();
}
참고: 관계 데이터가 배열되어 있어야 합니다. 도움이 되기를 바랍니다 :) 행복한 코딩
라라벨 5.8
먼저 피벗 열을 검색할 수 있도록 합니다.withPivot
당신에게 방법belongsToMany
내 코드에서 복사하여 시간 절약
// I have 3 columns in my Pivot table which I use in a many-to-many and one-to-many-through scenarios
$task = $user->goalobjectives()->where(['goal_objective_id'=>$goal_objective_id,'goal_obj_add_id'=>$goal_obj_add_id])->first(); //get the first record
$task->pivot->goal_objective_id = $new; //change your col to a new value
$task->pivot->save(); //save
주의할 점은 피벗 테이블에 기본 데이터가 있어야 한다는 것입니다.'id'
열쇠.
이를 원하지 않을 경우 다음을 시도해 볼 수 있습니다.
$tasks=$user->posts()->where(['posts_id'=>$posts_id,'expires'=>true])->get()->pluck('id'); // get a collection of your pivot table data tied to this user
$key=join(",",array_keys($tasks->toArray(),$valueYouWantToRemove));
$tasks->splice($key,1,$newValueYouWantToInsert);
$c = array_fill(0,$tasks->count(),['expires'=>true]); //make an array containing your pivot data
$newArray=$tasks->combine($c) //combine the 2 arrays as keys and values
$user->posts()->sync($newArray); //your pivot table now contains only the values you want
7월 4일 업데이트 위의 스니펫으로 업데이트.
//Ideally, you should do a check see if this user is new
//and if he already has data saved in the junction table
//or are we working with a brand new user
$count = $user->goalobjectives->where('pivot.goal_obj_add_id',$request->record)->count();
//if true, we retrieve all the ids in the junction table
//where the additional pivot column matches that which we want to update
if($count) {
$ids = $user->goalobjectives->where('pivot.goal_obj_add_id',$request->record)->pluck('id');
//convert to array
$exists = $ids->toArray();
//if user exists and both saved and input data are exactly the same
//there is no need
//to update and we redirect user back
if(array_sum($inputArray) == array_sum($exists)) {
//redirect user back
}
//else we update junction table with a private function
//called 'attachToUser'
$res = $this->attachToUser($user, $inputArray, $ids, $request->record);
}//end if
elseif(!$count) {
//we are working with a new user
//we build an array. The third pivot column must have equal rows as
//user input array
$fill = array_fill(0,count($inputArray),['goal_obj_add_id'=>$request->record]);
//combine third pivot column with user input
$new = array_combine($inputArray,$fill);
//junction table updated with 'user_id','goal_objective_id','goal_obj_add_id'
$res = $user->goalobjectives()->attach($new);
//redirect user if success
}
//our private function which takes care of updating the pivot table
private function attachToUser(User $user, $userData, $storedData, $record) {
//find the saved data which must not be deleted using intersect method
$intersect = $storedData->intersect($userData);
if($intersect->count()) {
//we reject any data from the user input that already exists in the database
$extra = collect($userData)->reject(function($value,$key)use($intersect){
return in_array($value,$intersect->toArray());
});
//merge the old and new data
$merge = $intersect->merge($extra);
//same as above we build a new input array
$recArray = array_fill(0,$merge->count(),['goal_obj_add_id'=>$record]);
//same as above, combine them and form a new array
$new = $merge->combine($recArray);
//our new array now contains old data that was originally saved
//so we must remove old data linked to this user
// and the pivot record to prevent duplicates
$storedArray = $storedData->toArray();
$user->goalobjectives()->wherePivot('goal_obj_add_id',$record)->detach($storedArray);
//this will save the new array without detaching
//other data previously saved by this user
$res = $user->goalobjectives()->wherePivot('goal_obj_add_id',$record)->syncWithoutDetaching($new);
}//end if
//we are not working with a new user
//but input array is totally different from saved data
//meaning its new data
elseif(!$intersect->count()) {
$recArray = array_fill(0,count($userData),['goal_obj_add_id'=>$record]);
$new = $storedData->combine($recArray);
$res = $user->goalobjectives()->wherePivot('goal_obj_add_id',$record)->syncWithoutDetaching($new);
}
//none of the above we return false
return !!$res;
}//end attachToUser function
자동 증분 ID가 없으면 사용자가 직접 액세스하여 피벗 테이블의 행을 업데이트, 삽입, 삭제할 수 없습니다.
피벗 테이블 업데이트의 경우 update를 사용할 수 있습니다.기존 Pivot 메서드입니다.
언급URL : https://stackoverflow.com/questions/33543897/how-to-update-a-pivot-table-using-eloquent-in-laravel-5
'source' 카테고리의 다른 글
AngularJS $http 오류 함수가 호출되지 않았습니다. (0) | 2023.10.24 |
---|---|
내 자바스크립트 파일의 캐싱을 방지하는 방법은? (0) | 2023.10.24 |
워드프레스에 모더니즈를 제대로 추가하는 것? (0) | 2023.10.24 |
PHP + Wordpress - 디렉토리에서 파일 목록 가져오기 (0) | 2023.10.24 |
이점 vs.로컬에서 jQuery를 호스팅하는 것의 함정 (0) | 2023.10.24 |