SQLクエリに長いフィールドがある場合、どのようにして読みやすくしますか?
例えば:
public function findSomethingByFieldNameId($Id) {
$sql = "SELECT field1, field2, field3 as Field3_Something, field4, field5, field6, field7, field8, field9
FROM table
JOIN table2 AS TNS ON TNS.id = table.id
WHERE something = 1";
return $this->db->fetchData($sql, null, 'all');
}
このように連結して、読みやすくすることができます。
$sql = "SELECT field1, field2, field3 as Field3_Something,";
$sql.= " field4, field5, field6, field7, field8, field9";
$sql.= " FROM table JOIN table2 AS TNS ON TNS.id = table.id";
$sql.= " WHERE something = 1";
注:クエリを連結するときは、二重引用符の間に新しい行を開始する前にスペースを残すことを忘れないでください。そうしないと、クエリの無効なエラーが発生します。
私はヒアドキュメント構文を好みますが、Nowdocはあなたの例でも機能します:
ヒアドキュメント:
http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc
Nowdoc: http://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.nowdoc
両方の利点は、エスケープしたりフォーマットしたりすることなく、このブロックとの間で直接SQLをコピーして貼り付けることができることです。二重引用符で囲まれた文字列の変数を使用する場合など、解析を含める必要がある場合は、ヒアドキュメントを使用します。 Nowdocは一重引用符のように動作します。
Nowdoc:
public function findSomethingByFieldNameId($Id) {
$sql = <<<'SQL'
SELECT field1, field2, field3 as Field3_Something, field4, field5, field6, field7, field8, field9
FROM table
JOIN table2 AS TNS ON TNS.id = table.id
WHERE something = 1
SQL;
return $this->db->fetchData($sql, null, 'all');
}
ヒアドキュメント:
public function findSomethingByFieldNameId($Id) {
$sql = <<<SQL
SELECT field1, field2, field3 as Field3_Something, field4, field5, field6, field7, field8, field9
FROM table
JOIN table2 AS TNS ON TNS.id = table.id
WHERE something = '$Id'
SQL;
$sql = mysql_real_escape_string($sql);
return $this->db->fetchData($sql, null, 'all');
}
私は無料のツールを使用しています@ http://www.sqlinform.com
<?php
public function findSomethingByFieldNameId($Id) {
$sql = "SELECT field1 ,
field2 ,
field3 AS Field3_Something,
field4 ,
field5 ,
field6 ,
field7 ,
field8 ,
field9
FROM TABLE
JOIN table2 AS TNS
ON TNS.id = table.id
WHERE something = 1";
return $this->db->fetchData($sql, null, 'all');
}
?>
個人的には、sprintf
は、一部のSQLサーバーが受け入れるprepared statement
と構造が非常に似ているため、これに最適なアプローチだと思います。
$sql = sprintf(
'SELECT
field1 as something,
field2,
field3 as Field3_Something,
field4,
field5,
field6,
field7,
field8,
field9
FROM table
JOIN table2 AS TNS
ON TNS.id = table.id
WHERE something = %s',
1
);
Heredoc
アプローチを使用してみましたが、単一の変数だけでなくオブジェクトを使用している場合は複雑になります。
<?php
public function findSomethingByFieldNameId($Id) {
$sql = "SELECT
field1,
field2,
field3 as Field3_Something,
field4,
field5,
field6,
field7,
field8,
field9
FROM
table
JOIN table2 AS TNS
ON TNS.id = table.id
WHERE
something = 1";
return $this->db->fetchData($sql, null, 'all');
}
?>
これは別の方法です。
配列結合は文字列連結よりも高速であることに注意してください。
$sql = join(" \n", Array(
'SELECT ',
' [...fields...]',
' [...more fields...]',
'FROM table',
'JOIN table2 AS TNS ON TNS.id = table.id',
'WHERE something = 1',
));
$sql = "SELECT field1,
field2,
field3 as Field3_Something,
field4,....
FROM table
JOIN table2 AS TNS ON TNS.id = table.id
WHERE something = 1";