programing

Laravel, sync() - 어레이를 동기화하고 추가 피벗 필드를 전달하려면 어떻게 해야 합니까?

goodcopy 2022. 12. 26. 21:37
반응형

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

반응형