Laravel, sync() - 어레이를 동기화하고 추가 피벗 필드를 전달하려면 어떻게 해야 합니까?
라라벨 공식 문서에는 다음과 같은 내용이 있습니다.sync()
기능:
$user->roles()->sync( array( 1, 2, 3 ) );
다른 피벗테이블 값을 지정된 ID와 관련지을 수도 있습니다.
$user->roles()->sync( array( 1 => array( 'expires' => true ) ) );
후자의 예에서는 하나의 피벗 행만 추가됩니다.동기화할 행이 여러 개 있는 경우 다른 피벗 테이블레코드를 어떻게 연관지을 수 없습니다.
잘 부탁드립니다.
위하여sync
커스텀 피벗 데이터와 함께 여러 모델이 필요합니다.
$user->roles()->sync([
1 => ['expires' => true],
2 => ['expires' => false],
...
]);
이.
sync([
related_id => ['pivot_field' => value],
...
]);
편집하다
코멘트 응답:
$speakers = (array) Input::get('speakers'); // related ids
$pivotData = array_fill(0, count($speakers), ['is_speaker' => true]);
$syncData = array_combine($speakers, $pivotData);
$user->roles()->sync($syncData);
난 이거면 돼
foreach ($photos_array as $photo) {
//collect all inserted record IDs
$photo_id_array[$photo->id] = ['type' => 'Offence'];
}
//Insert into offence_photo table
$offence->photos()->sync($photo_id_array, false);//dont delete old entries = false
이제 이 있습니다.->syncWithPivotValues($ids, $pivotValues)
동기화된 모든 항목에 대해 동일한 피벗 값을 설정하려면 메서드를 사용할 수 있습니다.
문서의 예:
$user->roles()->syncWithPivotValues([1, 2, 3], ['active' => true]);
설치/분리
또한 관련 모델과의 작업을 보다 편리하게 하기 위해 몇 가지 추가 도우미 방법을 제공합니다.예를 들어 사용자가 여러 역할을 가질 수 있고 역할이 여러 사용자를 가질 수 있다고 가정해 보겠습니다.모델을 조인하는 중간 테이블에 레코드를 삽입하여 역할을 사용자에게 부가하려면 attach 메서드를 사용합니다.
$user = App\User::find(1);
$user->roles()->attach($roleId);
모델에 관계를 연결할 때 중간 테이블에 삽입할 추가 데이터 배열을 전달할 수도 있습니다.
$user->roles()->attach($roleId, ['expires' => $expires]);
이전 역할을 제거하고 현재 첨부 중인 새 역할만 유지하려는 경우에도 동기화를 사용할 수 있습니다.
$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires]);
기본 동작은 두 번째 인수로 'false'를 전달하여 변경할 수 있습니다.그러면 기존 역할에 영향을 주지 않고 ID 1, 2, 3을 가진 역할이 연결됩니다.
이 모드에서는, 동기가 attach 방식과 같이 동작합니다.
$user->roles()->sync([1 => ['expires' => $expires], 2 => ['expires' => $expires], false);
참고 자료: https://laravel.com/docs/5.4/eloquent-relationships
프로젝트에 다음 특성을 추가하고 특성으로 모델 클래스에 추가합니다.여러 개의 피벗을 사용할 수 있는 기능이 추가되므로 유용합니다.아마 누군가 이것을 조금 치우고 개선할 수 있을 것이다.
namespace App\Traits;
trait AppTraits
{
/**
* Create pivot array from given values
*
* @param array $entities
* @param array $pivots
* @return array combined $pivots
*/
public function combinePivot($entities, $pivots = [])
{
// Set array
$pivotArray = [];
// Loop through all pivot attributes
foreach ($pivots as $pivot => $value) {
// Combine them to pivot array
$pivotArray += [$pivot => $value];
}
// Get the total of arrays we need to fill
$total = count($entities);
// Make filler array
$filler = array_fill(0, $total, $pivotArray);
// Combine and return filler pivot array with data
return array_combine($entities, $filler);
}
}
모델:
namespace App;
use Illuminate\Database\Eloquent\Model;
class Example extends Model
{
use Traits\AppTraits;
// ...
}
사용방법:
// Get id's
$entities = [1, 2, 3];
// Create pivots
$pivots = [
'price' => 634,
'name' => 'Example name',
];
// Combine the ids and pivots
$combination = $model->combinePivot($entities, $pivots);
// Sync the combination with the related model / pivot
$model->relation()->sync($combination);
필드 및 필드 값을 요소에 추가하기만 하면 됩니다.
$user->roles()->sync([
1 => ['F1' => 'F1 Updated']
]);
$data = array();
foreach ($request->planes as $plan) {
$data_plan = array($plan => array('dia' => $request->dia[$plan] ) );
array_push($data,$data_plan);
}
$user->planes()->sync($data);
나중에 잊어버릴 경우를 대비해서 여기에 두고 다시 구글로 검색해봐.
내 경우 각 행에 대해 추가 열이 동일한 데이터를 갖기를 원했습니다.
여기서 $syncData는 ID 배열입니다.
$syncData = array_map(fn($locationSysid) => ['other_column' => 'foo'], array_flip($syncData));
또는 화살표 없음
$syncData = array_map(function($locationSysid) {
return ['ENTITY' => 'dbo.Cli_Core'];
}, array_flip($syncData));
(array_flip은 ID를 어레이의 인덱스로 사용하고 있음을 의미합니다.)
foreach ($request->exercise_id as $key => $exercise_id) {
$data_plan[$exercise_id] = [
'serie' => $request->serie[$key],
'observation' => $request->observation[$key],
];
}
언급URL : https://stackoverflow.com/questions/27230672/laravel-sync-how-to-sync-an-array-and-also-pass-additional-pivot-fields
'programing' 카테고리의 다른 글
코드에서 jQuery 변경 이벤트를 트리거하는 방법 (0) | 2022.12.26 |
---|---|
수업 방법의 목적은 무엇입니까? (0) | 2022.12.26 |
어레이에서 랜덤 값을 얻는 방법 (0) | 2022.12.26 |
gem install: gem 네이티브 확장을 빌드하지 못했습니다(헤더 파일을 찾을 수 없습니다). (0) | 2022.12.26 |
연쇄 비교의 단순화 (0) | 2022.12.26 |