2017-05-09 1 views
0

데이터베이스에 저장하지 않고도 Eloquent 모델을 만들고 싶습니다. 그러나 모든 관계를 포함하여 단일 "push()"호출로 전체 구조를 저장할 수 있기를 바랍니다.Eloquent relations - belongsToMany에 추가 (저장하지 않음)

아래 예제는 내가 시도한 것을 보여줍니다. 게시물이 많은 태그를 가질 수

class Post extends Eloquent 
{ 
    public function tags() 
    { 
     return $this->belongsToMany('Tag'); 
    } 
} 

class Tag extends Eloquent 
{ 
    public function posts() 
    { 
     return $this->belongsToMany('Post'); 
    } 
} 

예쁜 표준을하고, 태그는 많은 게시물에 속할 수 있습니다 : 나는 다음과 같은 관계를 설정했습니다.

//create the post 
$post = new Post; 

//assign the tag (without saving anything yet!) 
$post->tags()->add($tag); 

//save the whole thing 
$post->push(); 

관련 문서는 here하지만 그것은 언급의가없는 것 같다

//save the post 
$post = new Post; 
$post->save(); 

//assign the tag 
$post->tags()->save($tag); 

그러나, 내가 정말 찾고 있어요 것은 :

나는 단순히 지금이 작업을 수행 할 수 있습니다 이해 "저장하다"가 아니라 belongsToMany에 "추가"하십시오.

도움을 주시면 감사하겠습니다. 당신이

$post->tags()->add($tag); 

가 무엇을 이해할 때

+0

나는 그것이 가능하지 않다고 생각한다. 포스트와 태그는 내가 잘못하지 않은 경우 태그가 post_id를 가지며 포스트가 저장 될 때만 id가 생성되고 포스트와 관련된 태그가 붙을 수있는 방식으로 관련됩니다. – Sandeep

+0

확실히 - 실제로 post_id와 tag_id는 모두 post_tag 테이블에 있지만 지점을 찍습니다. 나는 이것이 여전히 가능할 것이라고 생각했을 것이다. 구현 관점에서 볼 때, 피벗 전에 부모를 만들면됩니다. 확실히 가능 합니다만, 현재는 구현되어 있지 않을 수도 있습니다. – Blueberry

+0

같은 피벗 테이블이 있고 생성 된 ID를 사용하는 대신 다른 식별자를 외래 키로 사용하면 가능할 수 있습니다. 이를 통해 피벗 테이블을 먼저 저장 한 다음 게시물 및 관련 태그를 저장할 수 있습니다. – Sandeep

답변

1

이것은 실제로 매우 간단합니다. 이것은 태그 관계 ala 쿼리 빌더에 액세스 할 예정이지만, 태그/s를 게시물에 추가하기 만하면됩니다.

Laravel은이를 처리하는 방법에 내장되어 있지 않지만 쉽게 그렇게처럼 접근 할 수 있습니다 : 나는 코드를 테스트하지 않았습니다

$post->addTag($tag); // Adding a tag to our tag array 


protected $attributes = [ 
    'tags' => [],  
]; 

//type hint a tag and push the tag into our tags attribute 
public function addTag(Tag $tag) { 
    array_push($this->attributes['tags'], $tag); 
} 


//Iterate over the tags and attach them to our Post model, 
also save the post model after. 

public function push() { 
    return collect($this->attributes['tags'])->each(function($tag){ 
    $this->attach($tag); 
    }); 
    $this->save(); 
} 

아래 참조

하지만 잘하면 얻을 것이다 당신은 올바른 길을 택했습니다. 나는 또한 당신이이 구현을 향한 당신의 자아를 발견 한 이유를 아는 데 관심이있을 것입니다. 이전과 같은 용도로 사용 사례를 찾지 못했고 사용 사례를보다 표준화 된 방식으로 처리 할 수 ​​있도록 지원할 수 있습니다.

+0

답변 해 주셔서 감사합니다. 아마 당신이 옳고 이것은 표준 접근법이 아닙니다. 컨트롤러를 구현할 때 기본 CRUD 방법을 다루는 것뿐만 아니라 모든 것을 내부적으로 표준 모델로 변환하는 것이 아이디어였습니다.이것은 저장되거나, 수행 된 일부 작업을 던지거나, 버려지거나, 심지어 아무 것도 저장하지 않고 뷰에서 직접 사용할 수도 있습니다. 저장하고 싶다면 전체 모델을 DB로 푸시 할 수 있습니다. 보다 표준적인 접근 방법은 무엇입니까? – Blueberry

+0

위의 예에서 볼 수 있습니다. 미리 채워진 영구적이지 않은 Post 객체를 전달할 것입니다. 나는 프론트 엔드 (vuex.vuejs.org 참조)에서 모든 것을 지속하거나 State Persistence Pattern을 사용하는 경향이 있습니다. 그런 다음 사용자가 프런트 엔드에서 API로 Post 객체를 "밀어 넣기"를 원할 경우 프론트 엔드의 프레임 워크가 없으면 여기서하는 일과 비슷한 생각입니다. 어쩌면 당신은 당신이 당신의 웹 스택으로부터 더 많은 것을 필요로하는 곳에 있습니까? 이것이 Laravel을 사용하는 것이 마치 프론트 엔드에서 더 쉽게 유지 될 때 잔인하다고 생각됩니다. 단지 생각을위한 음식 – ExohJosh

+0

실제로 게시물과 태그 예제는 내 응용 프로그램에 전혀 없습니다. 단순히 내가하려고 한 것을 보여 주기만 한 것이 었습니다. 간단히 말해, 나는 Eloquent 모델이 필요한 경우 쉽게 저장할 수있는 기능을 통해 데이터를 유지할 수있는 단순한 방법 그 이상이라고 생각합니다. 당신이 대답 할 때 말했듯이, 모델의 커스터마이징이 가능하다고 믿습니다. 여전히 가능합니다. 단지 각 클래스를 사용자 지정하여 피벗을 처리해야합니다. 그러나 당신은 저에게 필요한 모든 것이 있는지 아닌지 고려해 보았습니다. 그렇게 고맙습니다! – Blueberry