jDatabase로 여러 레코드를 한 번에 삽입 할 수 있습니까?


11

루프를 사용하는 대신 Joomla 데이터베이스 함수가 ​​이와 같은 SQL 문을 작성할 수 있습니까?

INSERT INTO #__tablename (col1,col2)
VALUES 
 ('1', 'one'),
 ('2', 'two'),
 ('3', 'three'),
...
 ('999', 'three'),

JDatabase를 사용하여 데이터베이스액세스하는 데 대한 문서는 트랜잭션 및 SQL 또는 오브젝트 사용을 참조하지만 두 경우 모두 다중 값에 대한 언급은 없습니다.

답변:


12

이것을 사용하여 수행 될 수 ->insert()->values()(가)와, $values삽입하는 열 문자열의 배열되고.

$db = JFactory::getDbo();
$query = $db->getQuery(true);

$columns = array('col_one','col_two');
$values = array();
// Proper escaping/quotes should be done here, and probably in a loop, but cluttered the answer, so omitted it
$values[] = '1, "one"';
$values[] = '2, "two"';
$values[] = '3, "three"';
$values[] = '999, "nineninetynine"';

$query->insert($db->quoteName('#__tablename'));
$query->columns($columns);
$query->values($values);
$db->setQuery($query);
$db->query();

를 사용하여 생성 된 SQL echo $query->dump()

INSERT INTO `xyz_tablename`
(col_one,col_two) VALUES 
(1, "one"),(2, "two"),(3, "three),(999, "nineninetynine")

3

Joomla 코어는 기본 SQL 쿼리를 지원합니다. 여러 삽입을 저장하는 클래스를 만들고 마지막에 단일 삽입을 실행하는 단일 최종 쿼리를 만들 수 있습니다.

    public function flushInserts()
{
    $db = JFactory::getDbo();

    foreach ($this->bulk_tables as $table)
    {
        // No inserts
        if (!array_key_exists($table, $this->bulk_inserts))
        {
            continue;
        }

        $tableq = $db->qn($table);

        $insertSet = $this->bulk_inserts[$table];
        $values = implode(',', $insertSet);
        $query = 'INSERT INTO ' . $tableq . ' VALUES ' . $values . ';';

        $db->setQuery($query);
        $db->execute();

        if ($error = $db->getErrorMsg())
        {
            throw new Exception($error);
        }
    }

    $this->bulk_inserts = array();
}

0

@GDP의 답변에 추가

...
$columns = array('user_id', 'type', 'object', 'lvl', 'date');
$values  = array();
foreach ($batch as $row) {
    $array    = array(
        $row->user_id,
        $db->quote($row->type),
        $db->quote($row->object),
        $db->quote($row->lvl),
        $db->quote($row->date),
    );
    $values[] = implode(',', $array);
}
$query->insert($db->quoteName('#__activity_log'));
$query->columns($db->quoteName($columns));
$query->values($values);
...

@GDP의 승인 된 답변으로 아직 다루지 않은 답변의 가치를 설명 할 수 있습니까? 이것은 거의 코드 전용 답변입니다.
mickmackusa

프로그래밍 방식으로 $values변수로 변수 를 채우는 방법을 보여줍니다. 대답으로 쉼표로 구분 된 문자열을 수동으로 만들 거나 해당 문제에 연결하는 comma separated row strings대신 많은 시간을 절약하고 오류의 여백을 낮추는 방법을 보여줍니다 .
Mohd Abdul Mujib

이 정보는 미래의 연구원들을 교육시킬 수 있도록 귀하의 답변에 포함되어야합니다.
mickmackusa

코드가 꽤 자명 한 경우에는 개선의 여지가있을 수 있지만, 수정하고 자유롭게 답변을 수정하시기 바랍니다
Mohd Abdul Mujib

php / Joomla 구문의 의미를 이해하는 사람들에게는 코드가 자명합니다. 당신은 자신의 일을 개선하고 싶지 않습니까? JSX (스택 오버플로 이상)에서는 웹 개발 경력을 시작한 사람들이 CMS에 매료되기 때문에 답변을 충분히 설명하는 것이 매우 중요합니다. 여기에 컨텐츠를 게시하는 것이 교육을위한 것임을 알고 있습니까? 최선의 답변을 게시하고 투표 수익을 올릴 위험이 있습니다.
mickmackusa
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.