하나의 행의 데이터를 유연한 (또는 유창함)으로 다른 행에 복사하십시오.
문제
거래가 있습니다. 나는 다음과 같이 더 많거나 적은 테이블로 데이터베이스를 설정합니다 (실제로, 내 테이블은 훨씬 더 복잡하지만 이것은 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의 응답을 확인하십시오.