질문/조언질답게시판

 

<query id="getReceivedMessages" action="select">
    <tables>
        <table name="member_message" alias="message" />
        <table name="member" alias="member" />
    </tables>
    <columns>
        <column name="message.*" />
        <column name="member.user_id" />
        <column name="member.member_srl" />
        <column name="member.nick_name" />
        <column name="member.user_name" />
    </columns>
    <conditions>
        <condition operation="equal" column="message.receiver_srl" var="member_srl" notnull="notnull" />
        <condition operation="equal" column="message.message_type" var="message_type" default="R" pipe="and" />
        <condition operation="equal" column="message.sender_srl" var="member.member_srl" pipe="and" />
    </conditions>
    <navigation>
        <index var="sort_index" default="message.list_order" order="asc" />
        <list_count var="list_count" default="20" />
        <page_count var="page_count" default="10" />
        <page var="page" default="1" />
    </navigation>
</query>

 

위는 modules\communication\queries\getReceivedMessages.xml 입니다.
메시지를 보낸사람과, 받은사람 모두가 일치하는 결과값만 받고 싶습니다. (서브쿼리)
 
예를들어
$args->member_srl = $logged_info->member_srl;
$args->member.member_srl = $srl;
위와 같이 작동하면 오류가 발생합니다.

member.member_srl 에 존재하는 망할놈의 . 때문 입니다.
저 쩜을 xml파일에서 _으로 치환하고
 
$args->member_srl = $logged_info->member_srl;
$args->member_member_srl = $srl;
형태로 사용하면 오류없이 조건식이 성립됩니다.
 
다른 모듈들은 찾아보면 모두 _ 식으로 되어있는데 왜 유독 커뮤니케이션 모듈에서만 . 이 포함되어 있는걸까요 ㅠㅠ
 
현재 제작중인것을 완성하면 무료마켓에 배포할 의사가 있기 때문에...
코어 수정은 하지 않고 싶습니다. (저만 쓴다면 모를까 남들도 코어수정 해야 하잖아요)
 
코어를 수정하지 않고 저 $args->member.member_srl 을 활용하여 이중조건 (서브쿼리) 를 완성하려면
어떻게 적용해야 하나요? 트릭이 있나요?
  • ?
    var="member.member_srl" 는 $args->member.member_srl 의 변수로 받는다는 뜻이 아니라
    member 테이블의 member_srl 칼럼을 이용한다는 뜻이에요

    <condition operation="equal" column="message.sender_srl" var="member.member_srl" pipe="and" />
    member 테이블의 member_srl 값과 message 테이블의 sender_srl 값이 일치하는 경우.. 라는 의미가 되겠죠
    지금 member 테이블과 message 테이블을 join 한거잖아요. join 의 기준이 이 부분이 된거죠
  • ? profile
    모듈개발의 명장 세진님께서 답변을 주시니 감개무량 합니다.
    아까 테스트할때는 var를 변경하면 되었었는데.. 지금 다시보니 안되네요.. 제가 잘못 보았나봅니다.
    그렇다면 혹시 아래와 같이 executeQuery 방식으로 쿼리를 요청할때에 두가지 조건에 부합하는
    결과를 받는 방법이 있을까요?
     
    {@
              $rec->member_srl = $logged_info->member_srl;
              $rec->list_count = 2;
              $rtxt = executeQuery('communication.getReceivedMessages', $rec);
    }
    <pre>{print_r(rtxt)}</pre>

     

    위 코드를 실행하면 나에게 온 쪽지 가 모두 표시되는데

    나에게 왔으며 & 특정 srl을 가진 회원에게 온 쪽지 만을 받아오고 싶습니다.

     

    위 코드를 프린트한 결과값을 보면 받는사람, 보낸사람의 slr이 모두 들어있습니다만

    xe자체의 컨트롤러에는 두가지 조건을 모두 부합하는 정보를 받아오는 기능이 없는걸까요?

    구글을 오늘 하루종일 찾아보아도 안나옵니다 ㅠ.ㅠ 

    [message_srl] => 3806
    [related_srl] => 0
    [sender_srl] => 4
    [receiver_srl] => 1920
    [message_type] => R
    [title] => sd
    [content] => sd
    [readed] => Y
    [list_order] => -3806
    [regdate] => 20180424191717
    [readed_date] => 20180424232704
    [user_id] => root
    [member_srl] => 4
    [nick_name] => root
    [user_name] => root

     

    조언 부탁드립니다!!

  • ?
    현재 쿼리로는 불가능하죠
    <condition operation="equal" column="message.sender_srl" var="sender_srl" pipe="and" />
    형태를 추가하고
    $args->sender_srl 형태로 변수를 전달해서 쓰셔야할겁니다.

    별도 모듈이라면, query 문 자체를 모듈내부에 따로 넣으셔도 되고요
    Core 의 이 query 를 반드시 쓰셔야하는거면 Core 를 수정해야겠죠.
  • ? profile
    php echo 쓰는거 배운지 4일?5일? 정도된 왕 초보라서 부족한것이 여러모로 많습니다 ㅠㅠ
    되도록 코어단의 기능만 활용하려고 했는데 (퍼포먼스나 보안측면에서 이게 유리할것 같아서..)
    이부분은 아쉽지만 sql query 문을 작성해서 구현해야 겠습니다.
    상세한 답변 너무 감사드립니다!!
  • profile
    <query id="getReceivedMessages" action="select">
        <tables>
            <table query="true" alias="sub_message">
                <tables>
                    <table name="member_message" alias="message" />
                </tables>
                <columns>
                    <column name="*" />
                </columns>
                <conditions>
                    <condition operation="equal" column="message_type" var="message_type" default="R" pipe="and" />
                    <group pipe="and">
                        <condition operation="equal" column="sender_srl" var="member_srl" pipe="or" />
                        <condition operation="equal" column="receiver_srl" var="member_srl" pipe="or" />
                    </group>
                </conditions>
                <navigation>
                    <index var="sort_index" default="list_order" order="asc" />
                    <list_count var="list_count" default="20" />
                    <page_count var="page_count" default="10" />
                    <page var="page" default="1" />
                </navigation>
            </table>
            <table name="member" alias="member" type="left join">
                <conditions>
                    <condition operation="equal" column="member.member_srl" default="sub_message.sender_srl" pipe="or" />
                    <condition operation="equal" column="member.member_srl" default="sub_message.receiver_srl" pipe="or" />
                </conditions>
            </table>
        </tables>
        <columns>
            <column name="sub_message.*" />
            <column name="member.user_id" />
            <column name="member.member_srl" />
            <column name="member.nick_name" />
            <column name="member.user_name" />
        </columns>
        <conditions />
        <navigation>
            <index var="sort_index" default="message.list_order" order="asc" />
            <list_count var="list_count" default="20" />
            <page_count var="page_count" default="10" />
            <page var="page" default="1" />
        </navigation>
    </query>

     

    XE는 서브쿼리를 지원합니다.

    위 xml이 문제없이 동작한다는 보장은 못하지만 대충 이런식으로 만드셔서 활용하시면 될 것 같습니다.

    left join/right join/outer join 등과 alias, 조건을 적절히 활용해서 시도해보세요.

  • profile profile
    라르게덴님 답변 감사합니다.
    위의 xml을 임의로 커뮤니케이션 모듈에 추가하여 불러오는것 까지는 되었지만

    $rec->message_type = R;
    $rec->sender_srl = $logged_info->member_srl;
    $rec->receiver_srl = 1920;
    $rec->list_count = 2;
    $rtxt = executeQuery('communication.getFrdList', $rec);

    형식으로 호출하니

    BaseObject Object
    (
    [error] => 1064
    [message] => You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? ) and `list_order` <= 2100000000 ORDER BY `list_order` asc LIMIT 0 , 2) a' at line 1
    [variables] => Array
    (
    [_query] => SELECT `sub_message`.*, `member`.`user_id`, `member`.`member_srl`, `member`.`nick_name`, `member`.`user_name` FROM (SELECT * FROM `loc_member_message` as `message` WHERE ( `message_type` = ? ) and `list_order` <= 2100000000 ORDER BY `list_order` asc LIMIT 0 , 2) as `sub_message` left join `loc_member` as `member` on `member`.`member_srl` = `sub_message`.`sender_srl` or `member`.`member_srl` = `sub_message`.`receiver_srl` WHERE `message`.`list_order` <= 2100000000 ORDER BY `message`.`list_order` asc LIMIT 0, 2
    [_elapsed_time] => 0.00016
    )

    [httpStatusCode] => 200
    )
    1

    위와같이 출력됩니다. 알려주신 xml을 활용하려면 어떻게 호출하면 될까요..?
  • profile profile
    아.. 해결한것 같습니다.

    일치하기 원하는 컨디션들을 <group pipe="and"></group> 으로 묶어주니
    $args내에 넣은 조건에 모두 충족하는 경우만 출력됩니다.

    감사합니다!! 갈피를 잡았습니다