하나의 행의 데이터를 유연한 (또는 유창함)으로 다른 행에 복사하십시오.

StackOverflow https://stackoverflow.com//questions/25043944

문제

거래가 있습니다. 나는 다음과 같이 더 많거나 적은 테이블로 데이터베이스를 설정합니다 (실제로, 내 테이블은 훨씬 더 복잡하지만 이것은 GIST입니다) :

테이블`elements` / strong>

  • id
  • 데이터

테이블`element_drafts` / strong>

  • id
  • element_id
  • 데이터

이름에서 추측 할 수 있으므로 두 번째 테이블에는 첫 번째 테이블의 행 초안 인 행이 들어 있습니다. (초안을 수행하는 더 나은 방법을 추천하는 것에 대해 걱정하지 마십시오.=) 내 테이블은 표시된 것보다 복잡하고 초안 테이블이 가장 좋은 솔루션 ATM입니다.

다음과 같이 일을 할 수 있도록 두 테이블 사이의 관계를 설정했습니다.

// Get all of the elements along with their draft rows
$elements_with_drafts = Element::with('drafts')->all();
.

이 작업을 수행하여 행 작성이있는 요소 만 선택할 수 있습니다.

$elements_with_drafts = Element::with('drafts')
    ->whereIn('id', function($query)
    {
        $query->select('element_id')->from('element_drafts');
    })
    ->get();
.

하지만 알아낼 수 없습니다. 초안 값을 상위 요소로 복사 할 수 없습니다.

결국, 내 목표는 단일 쿼리를 통해 상위 요소 [ 'data'필드에 대한 모든 요소 _drafts [ '데이터'] 값을 복사하는 것입니다.

나는 이것이 가능하다는 것을 완전히 확신하지 못합니다. 그거야?

내 추측은 어떻게 든 이처럼 수행 될 수 있습니다 :

$elements_with_drafts = Element::with('drafts')
    ->whereIn('id', function($query)
    {
        $query->select('element_id')->from('element_drafts');
    })
    ->update(array("data" => function($query)
    {
        // Somehow select the draft value?
    });
.

나는 정말로 가까이있는 것처럼 느낍니다. 그러나 나는 내가 원하는 것을하는 방법을 확신하지 못합니다. 어떤 아이디어도 있습니까?

참고 : 분명히 이것은 foreach 루프와 비교적 쉽게 수행 할 수 있지만 단일 쿼리 일 솔루션을 원합니다.

도움이 되었습니까?

해결책

@ Ben 's Like, 그는 단지 몇 가지 실수를했습니다 :

DB::statement('UPDATE elements e
    JOIN element_drafts d ON e.id = d.element_id
    SET e.data = d.data');
.

사실 Query Builder도 사용할 수 있습니다 :

DB::table('elements as e')
    ->join('element_drafts as d', 'd.element_id', '=', 'e.id')
    ->update(['e.data' => DB::raw('d.data')]);
.

둘 다 동일하게 작동합니다.

첫 번째 행의 첫 번째 행의 e.data에서 d.data를 설정하면 (요소 당 하나보다 많은 초안이있는 경우)

다른 팁

DB::statement('UPDATE elements e
               JOIN drafts d
               SET e.data = d.data WHERE e.id = d.element_id');
.

편집 : 쿼리 빌더 솔루션에 대한 DECZO의 응답을 확인하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top