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.