ベンチャー企業のいいとこ、わるいとこ

結構いっぱいあるので、数回に分けてw

約1年数ヶ月前、立ち上げたばかりの現在の会社で働くこととなりました。
プログラマーということで、働きはじめたのですが、当時はPerl PHPって何よ?状態w

高校から、情報処理を専攻していたので、プログラムの基礎は知っていましたし、
前職のIT系の大手にて研修を受けた程度の知識はありました。


結局は1年間必死にプログラムして、今ではバリバリ使えますが、よくやったなと思います。

自己紹介はこれぐらいにしてw

ベンチャー企業のいいとこ

まずは、自分的に良いところですが、

 ・時間がわりと自由
 ・経営がすぐ生でみれる(決断の理由や、今後の会社の舵取りの課程が見れる)
 ・仕事を全て自分でコントロールすることができる(よく大きな企業でいう歯車として働くのではなく、全てやる)
 ・能力の高い人が多い

時間がわりと自由

私の場合は、フレックスタイムで11時〜17時までがコアタイムでした。朝が11時からでしたので、毎朝のラッシュから開放され、非常に快適でした。
また、帰りは17時からでしたが、大体22時〜23時ぐらいに帰ってました。

経営がすぐ生でみれる(決断の理由や、今後の会社の舵取りの課程が見れる)

これがベンチャーに来て一番よかったと思う点です。
私の目標も起業もしくはフリーランスで働くことなので、経営的な判断でこの場面では、
こうやると、結果がこうなるなど実際にやって見ないとわからないことが多く体験できました。

また、少人数で働く場合は、モチベーションが大切ですね。経営者の一言でどれだけ左右されるかも勉強になりました。

仕事を全て自分でコントロールすることができる(よく大きな企業でいう歯車として働くのではなく、全てやる)

これは、実感しました。前職では、機能の一部なり、マネイジメントをやると開発ができなかったり、物足りなさを感じることが多かったです。
ベンチャーだとそれはないですね。全てやるがスタンスでしたので、短期間でかなりのことが体験でき、能力がぐんぐん上がっていくのを実感できます。

まぁ、リスクを考えると、1人でやるのはどうかと思いますが・・・

能力の高い人が多い

ベンチャーを立ち上げるぐらいなので、当然、はじめから何らかに特化している人材がそろいます。
その人達に揉まれながら、自分自身が急成長する実感がたまりませんw

転職活動をはじめました

とうとう、今の会社ともお別れの時期が近づいて来ました。
去年の9月頃、ベンチャー企業の現在の会社に入社して、約1年間でしたが、色々な経験をさせていただきました。
現在の会社には、心からお礼を申し上げます。

一番身になったことは、技術的なことは勿論として、会社運営の難しさ、ベンチャーの大変さでしたね。
前職は大手に勤めていましたが、そのとき鍛えたマネイジメント力がかなり役に立ちました。
詳しくは追々書いていこうと思います。


今後の私の身の振り様は、まだ未定ですが、最近はフリーランスでやっていこうか、再度転職しようか悩んでますw

cake PHP モデルにアソシエーションを書くと全てアソシエーションされるんだけど、もっと簡単にできないの?

4、モデルにアソシエーションを書くと全てアソシエーションされるんだけど、もっと簡単にできないの?

モデルに定義するだけで、関連するデータをfindで取得できるのが、アソシエーションの利点です。
(日本語マニュアル:http://cakephp.jp/doc/ch06s04.html
、そんなにいらない場合が多々あります。


例えば
Aテーブルに対して関連するテーブルが、B、C、Dの3つあるとする。

そのうちBとCだけ必要な場合、どうしよう?となります。


動的にfindするときに指定できれば、便利ですよね。


cakePHPには動的に選択する機能があります。モデルの関数の
Model::bindModel( $params )
Model::unbindModel( $params )

こちらの詳しい解説を見つけました。(http://www.blueocean.bz/blog/cakephp/archives/14

ちょっと手の込んだやり方 便利です!!

元ネタがどこかのサイトなのですが、URLを忘れてしまいました^^;
主に私はこのやり方でやってます。
簡単に説明すると、コントローラーで都度、使用するアソシエーションを設定します

いじるソース
 ・コントローラー
 ・モデル
 ・app_model.php

コントローラーの定義方法

モデルのexpects関数(自作)にて使用する、アソシエーションを指定します。
上記の例でいくと、このような定義方法になります。
Aテーブルに対してB,Cテーブルのみアソシエーション

$this->A->expects(array('B','C'));


2段階以上のアソシエーションが必要な場合は、前回(http://d.hatena.ne.jp/takuya15/20071211/1197343801)のように、recursiveで指定してください。

$this->A->expects(array('B','C'));
$this->A->B->expects(array('D'));
$this->A->B->D->expects(array('E'));

$this->A->recursive = 3;
モデルでのアソシエーション定義

通常は、$hasOneなどのアソシエーション毎のメンバー変数を定義しますが、ここではAモデルを

public $assocs    = array(
    'B' =>
        array(
              // アソシエーション名(hasOne,hasMany,belongsTo,hasAndBelongsToMany)
              'type'         => 'hasOne',
              // ここから下のキーと値は、通常のアソシエーションと同じ
              'className'    => 'B',
              'order'        => '',
        ),
    'C' =>
        array('type'         => 'hasMany',
              'className'    => 'C',
              'order'        => '',
              'conditions'   => '',
        ),
    'D' =>
        array('type'         => 'belongsTo',
              'className'    => 'D',
              'order'        => '',
              'conditions'   => '',
        ),
);

$assocsの名前には、好きなようにしてください。次のapp_model.phpで使用するだけです。

同じように、B,Cモデルなどもアソシエーションがあれば設定

app_model.phpの修正

ここで、マジックを仕込みます。

まず、cake/app_model.php を app/app_model.php にコピー。
app/app_model.phpに対して以下を追加

    // アソシエーションの設定
    public function expects($array) {
        foreach ($array as $assoc) {
            $this->bindModel( 
                array($this->assocs[$assoc]['type'] => 
                    array($assoc => $this->assocs[$assoc]))); 
        } 
    }

cakePHP アソシエーション設定したけど使いたくないんだけど、どうしたらいい?

余談 アソシエーション設定したけど使いたくないんだけど、どうしたらいい?

前回「 http://d.hatena.ne.jp/takuya15/20071211/1197343801 」にて多段階のアソシエーションを設定後の取得方法
をやりましたが、じゃ、逆に設定したけどアソシエーションいらないばあいは??
recursiveを「0」にすればいいのか?

$this->A->recursive = 0;

だめなんです。
「0」ではなく、「-1」などのマイナスの値を設定します。

$this->A->recursive = -1;

ここらへんは、バージョンによって違うみたいですね。(昔は0だったとか・・・
調べていたら、なんとなくそんな感じでした。

こちらのcakePHP環境は、1.1.18.5850 で動作確認してます

cakePHP 多段階のアソシエーションができないんだけど?

3、多段階のアソシエーションができないんだけど?

アソシエーションの基本はこちらを参照「 http://d.hatena.ne.jp/takuya15/20071120/1195537015
上記を踏まえた上で3段階以上のアソシエーションのやり方です。


テーブルは以下の4つ

  1. Aテーブル
  2. Bテーブル
  3. Cテーブル
  4. Dテーブル

それぞれの関連性は

A⇒B⇒C
A⇒B⇒D

なので外部キーをそれぞれのテーブルに設定します。
Aテーブル:なし
Bテーブル:A_id
Cテーブル:B_id
Dテーブル:B_id


この状態でAテーブルに対してfindを行うと、A,B,C,Dテーブルの関連データが全て取得できます。
設定だけなので楽ですねw

え、C,Dのデータが取れない???
そうなんです、通常の

$this->A->findAll();

だと、アソシエーションの階層は1段階までです。
もちろん、自分で設定が可能です。
やり方は2パターン

  1. モデルのrecursive変数に設定
  2. findの実行時に引数に指定
モデルのrecursive変数に設定

上記のテーブルの場合は、Aテーブルのrecursiveに対して値を設定します。

$this->A->recursive = 2;

値は、取りたい階層分を指定しています。C,Dテーブルまで取りたいので2となります。
また、recursiveのデフォルト値は「1」です。なので、1階層までしか取れません。

findの実行時に引数に指定

find時の引数に指定をしますが、結局は内部的にAモデルのrecursiveを更新しています。
なので、考え方は一緒です。

$this->A->findAll(null,null,null,null,null,2);

マニュアルには、3まで設定可能と書いているので、マックスは3階層までなのかな?(未確認です)


ちなみに、recursiveはモデルのメンバー変数です。
なにが言いたいのかというと、一旦値を設定するとそのオブジェクトを使用する限り使い回されます。
上記のように2と設定すると、後は全て2になります。(当たり前か^^)
なので、始めは2階層まで取りたくて、次は1階層までで良いやという場合は、再度設定してね、
ということです。

cakePHP モデルなしのコントローラーって作れないの?


2、モデルなしのコントローラーって作れないの?


マニュアルを見る限り書いてないのですが、簡単にできます。
(日本語訳:http://cakephp.jp/doc/index.html )

通常、cakePHPのお約束として

テーブル名    : 複数形 (例:posts
モデル名     : 単数形 (例:post
コントローラー名 : 複数形 (例:posts


とすれば、設定をしないで、テーブルの情報をもってくることができます。
名前に対して命名規約があって、それに従っている限りでは、設定しなくても動きますよ ということです。
一見便利なのですが、実際ソースを書く場合に、1つのコントローラーに対して1つのモデルしか使わないことは、稀です。


ええ、設定でいくらでも変えれるんですね。
  1つのコントローラー 対 複数のモデル
  1つのコントローラー 対 モデル無し

などなど、


設定の仕方は、コントローラー内の変数に以下の配列を用意して、使用したいモデル名を記述するだけです。

class PostController extends AppController{
    public $uses = array('Post','hoge','hogehoge');


$usesにばしばし追加してください。逆にモデルを使いたくない場合は

class PostController extends AppController{
    public $uses = null;

cakePHP アソシエーションってどうやるの?

1、cakePHP アソシエーションってどうやるの?

アソシエーション便利ですね。
関連する複数テーブルのデータを簡単に取得することができます。

まず、アソシエーションの種類は
【種類】
・hasOne
・hasMany
・belongsTo
・hasAndBelongsToMany

hasOne (結構使ってます)

cakeマジックの仕掛け方。キーワードは「外部キー

テーブルは以下の2つ
 hogeテーブル、hogehogeテーブル

hogehogeテーブルに「hoge_id」というhogeテーブルの外部キーを作成する。([モデル名の単数形]_id)
hogeテーブルの「id」 == 「hoge_id」とする。(idはプライマリキー)


$this->hoge->findAll();
hogeテーブルと、関連するhogehogeテーブルの情報をゲット!!


相手に自分のIDが1つだけあるのがhasOneです

データはこんな配列で戻ってくる。

Arra
(
    [hoge] => Array
        (
            [id] => 35
            [title] => テスト
            [modified] => 2007-11-05 19:14:45
            [created] => 2007-08-28 18:55:43
        )

    [hogehoge] => Array
        (
            [id] => 14
            [hoge_id] => 35
            [modified] => 2007-11-05 19:14:45
            [created] => 2007-08-28 18:55:43
        )
)

hasMany (結構使ってます)

hasOneと似てます。違うのは、
相手に自分のIDが複数あるかも
1対多の関係です。


データはこんな配列で戻ってくる。

Arra
(
    [hoge] => Array
        (
            [id] => 35
            [title] => テスト
            [modified] => 2007-11-05 19:14:45
            [created] => 2007-08-28 18:55:43
        )

    [hogehoge] => Array
        (
            [0] => Array
                (
                     [id] => 14
                     [hoge_id] => 35
                     [modified] => 2007-11-05 19:14:45
                     [created] => 2007-08-28 18:55:43
                )
            [0] => Array
                (
                     [id] => 15
                     [hoge_id] => 35
                     [modified] => 2007-11-05 19:14:45
                     [created] => 2007-08-28 18:55:43
                )

        )

belongsTo (ぼちぼち使ってます)

hasOneと考え方が逆になります。
自分だけに相手のIDがあります


hogeはhasOneで、hogehogeと関連。
hogehogeはbelongsToで、hogeと関連。

$this->hogehoge->findAll();
で上記hogeでのhasOneと同じデータが取得できます。

まぁ、逆からのデータ取得の必要性が無い場合は、設定の必要が無い場合が多いかも。


hasAndBelongsToMany (全く使ってません)

説明がメンドイので割愛w



さらっと基礎的なことでした。
また、ここで説明した、プライマリーキー、外部キーはcakePHPでのお約束毎で名前が決まってます。
しかし、自由に名前を設定する事も可能です。
その代わり、設定が必要になります。
メイドイのでお勧めしませんw