질문을 삭제하지 말아주세요.!
 
1
0
-1
안녕하세요..! 책 두번이나 정독했는데 기본실력이 부족해서인지ㅠㅠ 아직 한참 더 해야할 거같습니다.. 도저히 못하겠어서 도움을 요청해봅니다.. 일단 제가 봐도 매우 서두없는글이라.. 양해 먼저 부탁드립니다. 주소를 만들고 있는데요 하단의 테이블 두개를 만들었습니다. Countrie citie 위 테이블의 아이디를 addr_user 테이블로 넣어 각 유저별로 주소를 가진 테이블을 만드려고 합니다.. ( 외래키 설정은 했습니다..) >>> $user->addrs()->sync([1]); Illuminate\Database\QueryException with message 'SQLSTATE[42S22]: Column not found: 1054 Unknown column 'addr_id' in 'field list' (SQL: select `addr_id` from `addr_user` where `user_id` = 10)' 이렇게 ..ㅠ 당연히 하나밖에 없으니.. 도시에 대한 정보를 못넣고 있는데요.. 이런건 어떻게 해야할까요..
    CommentAdd your comment...

    2 answers

    1.  
      1
      0
      -1

      시원하게 한번 짜보자면, 네이밍까지 라라벨 패턴대로 해볼께요

      먼저 테이블

      users

      • id
      • name

      countries

      • id
      • name

      cities

      • id
      • name

      addresses

      • id
      • user_id
      • country_id
      • city_id


      class User extends Model
      {
      	protected $table = 'users';
      
      
      	public function addresses() {
      		return $this->hasMany(Address::class, 'user_id');
      	}
      }
      
      
      class Country extends Model
      {
      	protected $table = 'countries';
      
      
      	public function addresses() {
      		return $this->hasMany(Address::class, 'country_id');
      	}
      
      
      	// 현재와 같은 구조에서는 belongsToMany가 아닌 hasManyThrough를 사용하셔야 합니다
      	public function users() {
      		return $this->hasManyThrough(User::class, Address::class, 'country_id', 'user_id', 'id', 'user_id');
      	}
      }
      
      class City extends Model
      {
      	protected $table = 'cities';
      
      	public function addresses() {
      		return $this->hasMany(Address::class, 'city_id');
      	}
      
      
      	public function users() {
      		return $this->hasManyThrough(User::class, Address::class, 'city_id', 'user_id', 'id', 'user_id');
      	}
      }
      
      class Address extends Model
      {
      	protected $table = 'addresses';
      
      	public function user() {
      		return $this->belongsTo(User::class, 'user_id');
      	}
      
      
      	public function country() {
      		return $this->belongsTo(Country::class, 'country_id');
      	}
      
      
      	public function city() {
      		return $this->belongsTo(City::class, 'city_id');
      	}
      }


      주소생성

      $user->addresses()->create(['country_id' => 1, 'city_id' => 1]);

      국가별 사용자 조회

      (hasManyThrough관계: https://laravel.kr/docs/5.6/eloquent-relationships#has-many-through)

      $country->users()->get();

      도시별 사용자 조회

      $city->users()->get();


      상상으로 만든 코드라 작동테스트는 안해봤습니다

        CommentAdd your comment...
      1.  
        1
        0
        -1

        우선

        User클래스에 정의된 addrs()는 어떤 관계로 지정하셨는지, 

        그리고 세가지 테이블의 column들을 모두 적어주시면 이해가 빠를것 같습니다


        추측해서 답변드리자면

        Country

        • id
        • name

        City

        • id
        • name

        User

        • id
        • name

        이렇게 3개 테이블과

        addr_user (모델 클래스명 AddrUser로 가정)

        • id
        • user_id
        • country_id
        • city_id

        관계지정 테이블 1개가 있다고 가정하면

        addr_user는 sync로 저장하실수 없구요

        관계는 User클래스에

        public function addrs() {
        	$this->hasMany(AddrUser::class, 'user_id');
        }

        이런관계로 지정하신다음 

        생성은 아래와 같이

        $user->addrs()->create([
        	'country_id' => $country->id,
        	'city_id' => $city->id,
        ]);

        sync와 비슷한 동작을 원하시면 updateOrCreate()으로

        $user->addrs()->updateOrCreate([
        	'country_id' => $country->id,
        	'city_id' => $city->id,
        ]);

        이렇게 구현하실수 있습니다


        updateOrCreate과 관련된 메뉴얼 링크 첨부해드립니다

        https://laravel.kr/docs/5.6/eloquent#other-creation-methods

        1. 문병철

          시간내어 답변 주신 점 정말감사드립니다. 

          음 정확히 추정하신거같은데요

          user 가 있고

          addr_user 테이블에

          id  | country_id | city_id | user_id 

          1    |      1         |     1     |    10

          10번 유저는 1번의 컨트리 아이디와 1번의 시티를 가지고 있다

          여기서 컨트리 아이디 1번은 예를 들어 한국, 시티 아이디 1번은 서울 입니다.

          각각 테이블에서 가져오는거구요.. 

          가져오는건 하겠는데 저장하는걸 못하겠다는게 맞겠네요 ^^;;

          말씀해주신대로 해봤는데 잘안되네요...ㅠ


          >>> $user = \App\User::find(10);
          => App\User {#858
          id: 10,
          name: "문병철",
          email: "moonptg@gmail.com",
          created_at: "2018-04-16 04:45:26",
          }
          >>> $user->addr_user()->updateOrCreate([
          'countrie_id' => 1,
          'citie_id' =>1,
          ]);
          PHP Error: Call to a member function updateOrCreate() on null on line 1
          >>>

          잘 알려주셨는데.. 죄송스럽네요.. ㅜ 참조주신 링크 열심히 봐야겠네요!



        2. 문병철

          아 저 그리구요.. user 모델에 선언하는거 알려주셨는데요

          AddrUser 모델에는 어떻게 선언해야하는걸까요...ㅜ 유저를 바라보게 해두긴했는데요...ㅠ

        3. Darron

          addr_user() 라는 이름으로 함수를 만드셨나요?

          함수이름이 addrs()면 그 이름대로 실행하셔야 합니다

        4. Darron

          AddrUser모델은 country와 city를 조회하기 위해 만드신것일테니

          관계함수 country() 와 city()도 belongsTo 관계로 구현하시면 됩니다

        5. 문병철

          항상 감사합니다.

          같은문제 구요..

          user 모델은


          public function addr_user() {
          $this->hasMany(Addr_user::class, 'user_id');
          }

          addr_user 모델은

          public function users()
          {
          return $this->belongsToMany(User::class);
          }

          citie 모델은

          protected $fillable = ['ct_code', 'ct_name'];

          public function users()
          {
          return $this->belongsToMany(User::class);
          }

          public function addr_users()
          {
          return $this->belongsTo(AddrUser::class);
          }

          countrie 모델은

          protected $fillable = ['c_code', 'c_name'];

          public function users()
          {
          return $this->belongsToMany(User::class);
          }
          public function addr_users()
          {
          return $this->belongsTo(AddrUser::class);
          }

          위와 같이 선언되어 있씁니다.

          팅커에서 

          >>> $user = \App\User::find(10);
          => App\User {#857
          id: 10,
          name: "문병철",
          email: "moonptg@gmail.com",
          created_at: "2018-04-16 04:45:26",
          }
          >>> $user->addr_user()->Create(['countrie_id' => 1, 'citie_id' => 1]);
          PHP Error: Call to a member function Create() on null on line 1


          위와 같이 유저정보를 넣은 후 updateOrCreate 든 create든 이런상태입니다..ㅠㅠ 

          뭐가 문제 일까요... 너무 질문만 하는거같아 면목이 없습니다..

        6. Darron

          null 에러는 아래 구문에 return이 없어서 그런것 같네요;;

          public function addr_user() {
              $this->hasMany(Addr_user::class, 'user_id');
          }
        7. 문병철

          헉1!!!! 허억!!!! 허어어어억!!!!! 크헠ㅋㅋㅋㅋㅋ 리턴... ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ

          성공했습니다....ㅜㅜ 흑흑.. 

          Darron 님 소중한 시간 할애해 끝까지 답변 해주셔서 정말 감사드립니다.

          열심히 공부해서 저도 남을 도울 수 있으면 좋겠네요..

          도큐먼트 꼼꼼히 살펴보고 공부를 더 열심히 하겠습니다.


          감사합니다.!!!!!!!!!  : )

        8. Darron

          넹 열심히 하셔서 한국 라라벨 커뮤니티에 기여해주세요 (smile)

        CommentAdd your comment...