2013-01-02 1 views
2

나는 Codeigniter에서 온 Laravel에 대해 처음으로 새롭다. 그리고 나는 대부분 그것을 좋아한다. 그러나 나는 정말로 Eloquent에 대한 나의 머리를 얻을 수 없다.Laravel - 능변을 이해하기 위해 정말로 애 쓰고있다.

SELECT * FROM site INNER JOIN tweeter ON tweeter.id = site.tweeter_id 

내가 (A는 "소속"으로)이 같은 일을 시도 : :이 같은 간단한 쿼리를 수행 할 경우

$site = Site::with('tweeter')->find($site_id); 

을하지만 지금은 두 가지 질문이 정말 필요과 같이되지 않는 IN() :

SELECT * FROM `site` WHERE `id` = '12' LIMIT 1 

SELECT * FROM `tweeter` WHERE `id` IN ('3') 

그래서 나는 시도하고 그래서 같이 가입 강제 :

$site = Site::join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->find($site_id); 

그리고 지금 나는 오류과 같이 얻을 : "site.id ="같은 것을 사용하는 데 필요한

SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous 

SQL: SELECT * FROM `site` INNER JOIN `tweeter` ON `tweeter`.`id` = `site.tweeter_id` WHERE `id` = ? LIMIT 1 

Bindings: array (
    0 => 12, 
) 

오류가 어디 그것은 명백하다. 그러나 어쨌든이 일이 일어나기를 나는 볼 수 없다.

그래서 나는 다시 유창에 가서 사용하여 바로 붙어있어 :

DB::table('site')->join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->where('site.id','=',$site_id)->first() 

나는 그것이 엄청난 문제가되지 같아요. 나는 정말로 웅변을 이해하고 싶다. 나는 도울 수 없지만 나는 그것이 크게 잘못되고 그것이 어떻게 작동하는지 오해하고 있다고 느낀다. 내가 놓친 게 있니? 아니면 정말 특별한 방법으로 사용해야합니까?

제가 궁금해하는 점은 어쨌든 Eloquent를 사용하여 만들고 싶은 쿼리를 만들 수 있습니까?

답변

3

실제로이 동작이 유리하다는 것을 알았습니다. 이 점을 고려해보십시오 (예제를 수정하겠습니다). 그래서 우리는 많은 사이트를 가지고 있고 각각은 많은 트위터를 가지고 있습니다. 각 사이트에는 DB에 많은 정보가 있습니다. 많은 열, 일부는 텍스트/데이터가 많은 텍스트 열입니다.

  1. 당신은 중복 데이터를 많이 얻을 :

    SELECT * FROM site INNER JOIN tweeter ON tweeter.id = site.tweeter_id 
    

    두 가지 단점이 있습니다

    당신은 쿼리를 당신의 방법을.동일한 사이트의 트위터에 대해 얻는 각 행에는 한 번만 필요한 동일한 사이트 데이터가 있으므로 PHP와 DB 사이의 통신에는 더 오래 걸립니다.

  2. foreach (tweeter_of_this_site)를 어떻게합니까? 어떤 종류의 목록에 모든 사이트를 표시 한 다음 각 사이트 내에서 모든 트위터를 표시한다고 생각합니다. 이를 위해 사용자 정의 로직을 프로그래밍해야합니다. 그것은 한 번만 사이트 데이터를 얻을 수 있으며이 작업을 수행 할 수 있습니다 : 다음 ORM 접근 방식을 사용

이러한 문제를 모두 해결

foreach ($sites as $site) { 
    foreach($site->tweeters as $tweeter) {} 
} 

내가 또한 말인지 것은 : 싸움을하지 않습니다 그것! 필자는 전에 말했던 적이있었습니다. 왜 ORM을 사용하겠습니까? SQL을 직접 코딩 할 수 있습니다. 감사합니다. 이제 저는 Laravel에서 사용하고 있습니다.

0

항상 Eloquent를 Fluent의 확장이라고 생각할 수 있습니다.

실행중인 문제는 find() 명령으로 인해 발생합니다. 테이블 이름없이 id을 사용하므로 모호하게됩니다.

은 문서화 된 문제입니다 :https://github.com/laravel/laravel/issues/1050

당신이 찾고있는 명령을 만들려면, 당신은이 작업을 수행 할 수 있습니다 물론

$site = Site::join('tweeter', 'tweeter.id', '=', 'site.tweeter_id')->where('site.id', '=', $site_id)->first($fields); 

,와 구문) (가입 -> 찾기() 해당 문제 수정이 적용되면 이 맞습니다..

+0

그렇다면 웅변을 사용하는 데있어 중요한 점은 무엇입니까? 이것은 내가 정말로 이해하지 못하는 것입니다. Eloquent의 새로운 기능은 완전히 중복되고 Fluent를 사용할 수도 있습니다. – robjbrain

+0

Eloquent는 ORM이므로 가상 데이터베이스와 비슷한 코드에 액세스 할 수 있습니다. Eloquent는 이와 같은 조인을 사용하는 것과는 대조적으로 관계를 관리 할 때 훨씬 더 의미가 있습니다. 또한 Eloquent를 사용하면 열심히로드 할 수 있으므로 DB 호출 횟수가 줄어 듭니다. –

+0

또한 ORM은 최적의 SQL 쿼리 방법을위한 것이 아닙니다. 이것은 모든 유형의 ORM에 해당됩니다. –

관련 문제