データベースにアクセスしクエリを発行する
concrete5 でカスタムデータベースクエリを作成することは簡単です。どのメソッド、コントローラー、またはビュー(もちろん推奨できませんが)からも行うことができます。データベースオブジェクトを取得するにはシンプルに次の関数を実行してください。
\Database::connection();
例
public static function getFoo($id)
{
$db = \Database::connection();
$foo = $db->fetchColumn('SELECT foo FROM bar WHERE id = ?', [$id]);
return $foo;
}
ここで、単に文字列として追加するのではなく、 $id が2つめのパラメーターとして渡されていることに注意してください。これは、SQLインジェクションを防ぐためのプリペアドステートメントを使うための方法です。
Doctrine API
concrete5 のデータベースクラスは、Doctrine DBAL Connection オブジェクトをかなりベースにしています。
Doctrine の機能はこちら:
http://www.doctrine-project.org/api/dbal/2.1/class-Doctrine.DBAL.Connection.html
DBAL のオートクオート、プレースホルダー、UPDATE と DELETE クエリーについてはこちら:
http://doctrine-orm.readthedocs.org/projects/doctrine-dbal/en/latest/reference/data-retrieval-and-manipulation.html
非推奨メソッド
もしかすると、 Loader::db() や or Database::get() のような記述を見かけたことがあるかもしれません。これらのメソッドでもデータベースに接続が可能ですが、非推奨となっています。新しい \Database::connection(); を使用するようにしてください。
高度なトピック:依存性の注入の使用
もしカスタムクラスを開発していて、あなたのクラスメソッドないからこのメソッドを呼び出すよりも、クラスの中でアクティブなデータベースコネクションを使用したい場合、次のようにクラスのコンストラクタの中でパラメーターとしてデータベースを定義します。
namespace My\Custom\Name;
use Concrete\Core\Database\Connection\Connection;
class Bar
{
protected $connection;
public function __construct(Connection $connection)
{
$this->connection = $connection;
}
public function getFoo($id)
{
$foo = $this->connection->fetchColumn('SELECT foo FROM bar WHERE id = ?', [$id]);
return $foo;
}
}
Core::make() メソッドを使ってカスタムオブジェクトをインスタンス化する際に、Connection のような依存関係は自動的に解決されます。
$bar = Core::make('My\Custom\Name\Bar');
$foo = $bar->getFoo(12);
直接クラスをインスタンス化しておらず、アクティブなコネクションを渡していなかったにもかかわらず、Core::make() メソッドはインテリジェントにインスタンス化を行い、コンストラクタに必要なオブジェクトを提供します。