programing

Laravel DB:select()는 그룹 내의 모든 열을 다음과 같이 요구합니다.

newsource 2022. 9. 22. 00:26

Laravel DB:select()는 그룹 내의 모든 열을 다음과 같이 요구합니다.

커스텀 쿼리를 실행해야 하며 이 모든 방법을 시도해 보았습니다.

$sql = "SELECT acd.*, DATE_FORMAT(acd.cdate, '%d/%m/%Y') cdate_disp,
  GROUP_CONCAT(CONCAT_WS(', ', car.type, car.session, crd.name) SEPARATOR '<br />') rd_names,
  acb.booking_status my_booking_status
FROM app_data acd
INNER JOIN crmaccounts ca ON ca.id = acd.client_crm_id
LEFT JOIN crmaccount_rdids car ON car.account_id = ca.id
LEFT JOIN crmrd_ids crd ON crd.id = car.rd_id
LEFT JOIN app_bookings acb ON acb.call_ref_id = acd.call_ref AND acb.user_id = 12391
WHERE 1=1 
AND acd.client_crm_id NOT IN (select account_id from bstaff WHERE user_id=12391)
GROUP BY acd.id
ORDER BY acd.cdate, ctiming";

DB:select($sql);

던지다

조명 \ 데이터베이스 \ QueryException ( 42000 ) SQLSTATE [ 42000 ] :구문 오류 또는 액세스 위반: 1055 'mydatabase.acd.call_ref'가 GROUP BY(SQL: ......)에 없습니다.

DB::select($sql);

DB::raw($sql);

DB::select(DB::raw($sql));

//even with pdo 
$sth = DB::getPdo()->prepare($sql);
$sth->execute();
$data = $sth->fetchAll(\PDO::FETCH_OBJ);

 PDOException (42000)
SQLSTATE[42000]: Syntax error or access violation: 1055 'mydatabase.acd.call_ref' isn't in GROUP BY

작업을 시작하려면 다음 표에 있는 모든 열을 나열하는 방법밖에 없는 것 같습니다.group by실행은 가능하지만 편리하지는 않습니다.

phpmyadmin에서도 같은 쿼리를 직접 실행할 수 있습니다.그래서 왜 Larabel을 통해 실행할 때 모든 열을 추가하라고 하는지 잘 모르겠습니다.

MariaDB가 설치되어 있으며 Laravel과 PhpMyAdmin이 모두 동일한 인스턴스에 연결되어 있습니다.Larvel 버전은 5.8.5입니다.

여기서도 질문했지만 답변을 찾을 수 없으니 자세한 질문을 봐주세요.https://laracasts.com/discuss/channels/eloquent/query-runs-ok-in-phpmyadmin-but-dbselect-throws-exception

에서는 strict 모드를 디세블로 해 주세요.config/database.php, mysql 접속 섹션.

이는 Larabel 문제가 아니라 MySQL에 의한 논리적 제한입니다.결과 세트에 없는 열을 추가하는 경우GROUP BY절, 결과 집합의 이러한 열에 대해 다른 값을 사용할 수 있습니다.

쿼리를 엄밀한 모드(기본적으로 켜져 있음)로 실행하면 예기치 않은 결과가 발생할 수 있으므로 MySQL은 이를 허용하지 않습니다.strict 모드를 끄면 MySQL은 이러한 열에 대해 처음 검색된 결과를 사용합니다.

Laravel 설정 파일에서 strict 모드를 끌 수 있습니다.config/database.php단, 예측할 수 없기 때문에 쿼리를 변경하는 것이 좋습니다.

완전 모드 체크의 전체 목록은 MySQL 문서(https://dev.mysql.com/doc/refman/8.0/en/sql-mode.html#sql-mode-strict에서 확인할 수 있습니다.

Larabel 4.8을 설치하고 Auth도 설정했습니다.또한 역할과 상태라는2개의 테이블을 추가하여 당신의 pdo 코드를 시도했습니다.완벽한 동작입니다!여기, 내 코드를 넣었어.

$sql = "SELECT * 
            FROM users u
            INNER JOIN roles r ON r.id = u.role_id
            LEFT JOIN states s ON s.id = u.state_id

            WHERE 1=1 

            GROUP BY u.id
            ORDER BY u.id ";

    $sth = DB::getPdo()->prepare($sql);
    $sth->execute();
    $data = $sth->fetchAll(\PDO::FETCH_OBJ);

    dd($data);

당신의 DB 구조가 무엇인지 알고 싶습니다.

언급URL : https://stackoverflow.com/questions/55296665/laravel-dbselect-requires-all-columns-in-the-group-by