programing

아직 첨부되지 않은 경우 Larvel 관계가 첨부

telebox 2023. 9. 19. 20:59
반응형

아직 첨부되지 않은 경우 Larvel 관계가 첨부

아직 관계가 붙어있지 않다면 관계를 빨리 붙일 수 있는 방법이 있을까요?모델의 관계를 업데이트하기 위해 이 코드를 사용하고 있습니다.

        if (!empty($request->get('roles')) && is_array($request->get('roles'))) {
            $message->Roles()->attach($request->get('roles'));
        }
        if (!empty($request->get('users')) && is_array($request->get('users'))) {
            $message->Users()->attach($request->get('users'));
        }

그러나 나는 이 오류를 받고 있습니다. 나는 이 오류입니다.

SQLSTATE[23000]:무결성 제약 조건 위반: 1062 키 'PRIMATIONAL'에 대한 중복 항목 '1-41'(SQL: insert tomessage_user(message_id,user_id) 값 (1, 41), (1, 42), (1, 43), (1, 44), (1, 45), (1, 46), (1, 47), (1, 48), (1, 49), (1, 50)

나는 어떤 사용자가 아직 첨부되지 않은 배열 검사 목록을 아주 길게 작성해서 첨부하는 것을 피하고 싶습니다.그리고 이게 유일한 방법인지 알려주시기 바랍니다.

나는 다음과 같은 생각을 하고 있습니다.

$message->Users()->attachIfNotAttached($request->get('users'));

Laravel에는 이에 대한 기본 제공 방법이 있습니다 - 분리 없이 동기화:

$message->Users()->syncWithoutDetaching($request->get('users'));

사용.syncWithoutDetaching아니면sync([arr], false)코드는 깨끗해 보이지만 성능은 25배느립니다.attach(). 각 ID를 확인하고 항목별로 개별 데이터베이스 삽입을 수행하기 때문입니다.

는 폴 슈피겔의 답변을 토대로 웅변을 확장하거나 당신의 모델 수업에 새로운 방법을 만드는 것을 제안합니다.

내가 사용할 때는Feed계급과.Post다수와 다수의 피벗으로 연결된 클래스저는 피드 클래스에 다음과 같은 방법을 추가했습니다.

public function attachUniquePosts($ids)
{
    $existing_ids = $this->posts()->whereIn('posts.id', $ids)->pluck('posts.id');
    $this->posts()->attach($ids->diff($existing_ids));
}
  • 20개의 게시물을 피드에 부착하기syncWithoutDetaching()평균 0.107초를 찍었습니다.
  • 20개의 게시물을 피드에 부착하기attachUniquePosts()평균 0.004초가 걸렸습니다.

이와 같은 것이 작동할 수 있습니다.

이미 첨부된 ID를 가져옵니다.

$attachedIds = $message->Users()->whereIn('id', $request->get('users'))->pluck('id');

요청 배열에서 첨부된 ID를 제거합니다.

$newIds = array_diff($request->get('users'), $attachedIds);

새 ID를 첨부합니다.

$message->Users()->attach($newIds);

정보: 다음과 같습니다.syncWithoutDetaching()Amazon Aurora MySQL에서 작동하지 않습니다.

detach를 사용하여 확인한 후 다음과 같은 기능으로 attach를 사용할 수 있습니다.

$handleUserMoving = function ($message) use($user) {
        $message->Users()->detach($user);
        if (!$message->Users()->where('users.id', $user->id)->exists()) 
        {
            $message->Users()->attach($user);
        }
};
$message->Users()->each($handleUserMoving);

언급URL : https://stackoverflow.com/questions/45356606/laravel-relationships-attach-if-not-already-attached

반응형