doctrine join して sfDocetinePager 使うと大量にSQLはかれる

$this->hasMany('ATable', array('local' => 'a_table_id', 'foreign' => 'id'));
$q = $this->createQuery()
          ->select('self.id as id')
          ->from($this->_options['name'] . ' self')
          ->leftJoin('self.ATable at');

$pager = new sfDoctrinePager($this->_options['name'], $limit);
$pager->setQuery($q);
$pager->setPage($page);
$pager->init();

ってあったときにこれで取得したレコードを foreach で回すと1レコードごとに1SQL発行しちゃう。

$this->hasMany('ATable', array('local' => 'a_table_id', 'foreign' => 'id'));
$q = $this->createQuery()
          ->select('self.id as id, at.id as at_id')
          ->from($this->_options['name'] . ' self')
          ->leftJoin('self.ATable at');

$pager = new sfDoctrinePager($this->_options['name'], $limit);
$pager->setQuery($q);
$pager->setPage($page);
$pager->init();

のようにしてjoinしてるテーブルの主キー(今回の場合はat.id)を明示的にselectすると解決。

なんでやねん。

jquery で複数の ajax 処理が終わったらある処理をしたいとき

var requests = [
    { url: 'http://...', settings: { ... } },
    { url: 'http://...', settings: { ... } },
    { url: 'http://...', settings: { ... } }
];
 
var dfds = [];
for (var i =0; i < requests.length; i++) {
    req = requests[i];
    dfd = $.ajax(req.url, req.settings);
    dfds.push(dfd);
}
 
$.when.apply($, dfds).done(function() {
    //処理
})

ってやるとdedsの処理がすべて終わったら特定の処理を行うことができる。
jQuery.ajax のコールを行って、戻り値として得られる jQuery.Deferred を dfds 配列に格納して
$.when.apply($, dfds).done で全ての Ajax コールの終了を待機してる。
なるほど。

親クラスの中で小クラスでオーバーライドした関数や変数を使いたいとき

class parent
{
  const test = 1;
  public function test()
  {
    echo self::test
  }
}

class child extends parent
{
  const test = 2;
}

$hoge = new child;
$hoge->test();

ってやると 1 が出力されちゃう。
これを 2 を出したいときは

class parent
{
  const test = 1;
  public function test()
  {
    echo constant(get_called_class().'::test')
  }
}

class child extends parent
{
  const test = 2;
}

$hoge = new child;
$hoge->test();

ってやってあげると 2 が出る。
定数なら constant 使えばいいし
関数なら call_user_func 使えばOK(call_user_func(get_called_class().'::sendMail', $test) ッて感じ) 

android 画像の上書きをしたい

上書きするときは一旦ちゃんとデータベースの情報も消さないと
ギャラリーのサムネイルで古いの表示されたりしちゃう

File saveFile = new File(attachName);
if(saveFile.exists()) { //上書き保存の場合はデータベースの情報をいったん消す
  String[] proj = {
    MediaStore.Images.Media._ID,
    MediaStore.Images.Media.DATA,
  };
  Cursor cursor = activity.managedQuery(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
    proj,
    MediaStore.Images.Media.DATA + " = ?",
    new String[] { attachName },
    null);
  if(cursor.getCount() != 0) {
    cursor.moveToFirst();
    Uri deleteUri = ContentUris.appendId(
    MediaStore.Images.Media.EXTERNAL_CONTENT_URI.buildUpon(),
    cursor.getLong(cursor.getColumnIndex(MediaStore.Images.Media._ID))).build();
    activity.getContentResolver().delete(deleteUri, null, null);
  }
}

android で同期通信したかった

画像Aをよんで画像Bをよんでその後処理Cを実行したくて悪戦苦闘。
そんな時ここのブログに救われました。

http://ameblo.jp/programmer-samurai/entry-11518431582.html
時間あるときにプログラムちゃんと読んでみる。