http://agiletoolkit.org/doc/modeltable/referenceに示されている例を使用して、あるモデルから別のモデルへの参照を手動で作成しようとしています。次のテーブルとモデルを使用しています。
人物表
- id: 主キー
- 名前:チャー
- room_number: 整数
- 電子メール: 文字
ユーザーテーブル
- id: 主キー
- person_id: Person テーブルへの外部キー (id)
- パスワード: 文字
ATK4.2 クラスは以下のとおりです。
人物モデル
class Model_Person extends Model_Table {
public $entity_code='person';
function init(){
parent::init();
$this->addField('name');
$this->addField('roomnumber');
$this->addField('email');
}
}
ユーザーモデル
「user」テーブルには、パスワード フィールドが含まれています。
class Model_User extends Model_Table {
public $entity_code='user';
function init(){
parent::init();
$field_ref = $this->add('Field_Reference', 'person_id');
$field_ref->dereferenced_field = 'person_str';
// add referenced Model
$m = $this->add('Model_Person');
$m->addField('name');
// Link referenced model field name to this model field.
$field_ref->setModel($m, 'name');
}
}
ただし、Model_Person クラスが間違ったパス Model/Model/Person.php を使用して追加されているというエラーが表示されます。
PathFinder_Exception
Unable to include Model/Model/Person.php
Additional information:
type: php
attempted_locations: Array ( [0] => /var/www/html/seqtrack/admin/lib/Model/Model/Person.php [1] => /var/www/html/seqtrack/atk4/lib/Model/Model/Person.php [2] => /var/www/html/seqtrack/admin/../lib/Model/Model/Person.php [3] => /var/www/html/seqtrack/atk4/../atk4-addons/mvc/Model/Model/Person.php [4] => /var/www/html/seqtrack/atk4/../atk4-addons/misc/lib/Model/Model/Person.php )
/var/www/html/seqtrack/atk4/lib/BaseException.php:38
Stack trace:
/var/www/html/seqtrack/atk4/lib/BaseException.php :38 PathFinder_Exception PathFinder_Exception->collectBasicData(Null, 1, 0)
/var/www/html/seqtrack/atk4/lib/PathFinder.php :213 PathFinder_Exception PathFinder_Exception->__construct("Unable to include Model/Model/Person.php")
/var/www/html/seqtrack/atk4/lib/PathFinder.php :131 PathFinder_Exception PathFinder_Exception->__construct("php", "Model/Model/Person.php", Array(5))
/var/www/html/seqtrack/atk4/lib/PathFinder.php :195 test_pathfinder PathFinder->locate("php", "Model/Model/Person.php", "path")
/var/www/html/seqtrack/atk4/lib/AbstractObject.php :159 test_pathfinder PathFinder->loadClass("Model_Model_Person")
/var/www/html/seqtrack/atk4/lib/Field/Reference.php :89 test_mgr_tabs_view_htmlelement_crud_model_user_person_id Field_Reference->add("Model_Model_Person")
/ : test_mgr_tabs_view_htmlelement_crud_model_user_person_id Field_Reference->calculateSubQuery(Object(Model_User), Object(DB_dsql_mysql), Object(Field_Expression))
/var/www/html/seqtrack/atk4/lib/Field/Expression.php :44 Loggercall_user_func(Array(2), Object(Model_User), Object(DB_dsql_mysql), Object(Field_Expression))
/var/www/html/seqtrack/atk4/lib/Model/Table.php :169 test_mgr_tabs_view_htmlelement_crud_model_user_person_str Field_Expression->updateSelectQuery(Object(DB_dsql_mysql))
/var/www/html/seqtrack/atk4/lib/Model/Table.php :327 test_mgr_tabs_view_htmlelement_crud_model_user Model_User->selectQuery()
/var/www/html/seqtrack/atk4/lib/CompleteLister.php :104 test_mgr_tabs_view_htmlelement_crud_model_user Model_User->rewind()
/var/www/html/seqtrack/atk4/lib/Grid/Basic.php :175 test_mgr_tabs_view_htmlelement_crud_grid Grid->renderRows()
/var/www/html/seqtrack/atk4/lib/CompleteLister.php :118 test_mgr_tabs_view_htmlelement_crud_grid Grid->renderRows()
/var/www/html/seqtrack/atk4/lib/Grid/Advanced.php :152 test_mgr_tabs_view_htmlelement_crud_grid Grid->render()
/var/www/html/seqtrack/atk4/lib/AbstractView.php :214 test_mgr_tabs_view_htmlelement_crud_grid Grid->render()
/var/www/html/seqtrack/atk4/lib/AbstractView.php :205 test_mgr_tabs_view_htmlelement_crud_grid Grid->recursiveRender()
/var/www/html/seqtrack/atk4/lib/AbstractView.php :205 test_mgr_tabs_view_htmlelement_crud CRUD->recursiveRender()
/var/www/html/seqtrack/atk4/lib/AbstractView.php :205 test_mgr_tabs_view_htmlelement View_HtmlElement->recursiveRender()
/var/www/html/seqtrack/atk4/lib/AbstractView.php :205 test_mgr_tabs Tabs->recursiveRender()
/var/www/html/seqtrack/atk4/lib/AbstractView.php :205 test_mgr page_mgr->recursiveRender()
/var/www/html/seqtrack/atk4/lib/ApiWeb.php :236 test AdminFrontend->recursiveRender()
/var/www/html/seqtrack/atk4/lib/ApiFrontend.php :123 test AdminFrontend->execute()
/var/www/html/seqtrack/atk4/lib/ApiWeb.php :226 test AdminFrontend->execute()
/var/www/html/seqtrack/admin/index.php :8 test AdminFrontend->main()
同様の問題は、ATK DVD のサンプル Web ページにも見られます。
http://example.agiletoolkit.org/examples/dvdrental/
PathFinder_Exception
Unable to include Model/Model/Customer.php
Additional information:
type: php
attempted_locations: Array ( [0] => /www/agiletoolkit.org/example/examples/dvdrental/lib/Model/Model/Customer.php [1] => /www/agiletoolkit.org/example/atk4/lib/Model/Model/Customer.php [2] => /www/agiletoolkit.org/example/atk4/../atk4-addons/mvc/Model/Model/Customer.php [3] => /www/agiletoolkit.org/example/atk4/../atk4-addons/misc/lib/Model/Model/Customer.php )
/www/agiletoolkit.org/example/atk4/lib/BaseException.php:38
Stack trace:
/www/agiletoolkit.org/example/atk4/lib/BaseException.php :38 PathFinder_Exception PathFinder_Exception->collectBasicData(Null, 1, 0)
/www/agiletoolkit.org/example/atk4/lib/PathFinder.php :209 PathFinder_Exception PathFinder_Exception->__construct("Unable to include Model/Model/Customer.php")
/www/agiletoolkit.org/example/atk4/lib/PathFinder.php :134 PathFinder_Exception PathFinder_Exception->__construct("php", "Model/Model/Customer.php", Array(4))
/www/agiletoolkit.org/example/atk4/lib/PathFinder.php :195 Frontend_pathfinder PathFinder->locate("php", "Model/Model/Customer.php", "path")
/www/agiletoolkit.org/example/atk4/lib/AbstractObject.php :158 Frontend_pathfinder PathFinder->loadClass("Model_Model_Customer")
/www/agiletoolkit.org/example/atk4/lib/AbstractController.php :26 Frontend Frontend->add("Model_Model_Customer")
/www/agiletoolkit.org/example/examples/dvdrental/lib/RentalAuth.php :5 Frontend_rentalauth RentalAuth->setModel("Model_Customer")
/www/agiletoolkit.org/example/atk4/lib/AbstractObject.php :181 Frontend_rentalauth RentalAuth->init()
/www/agiletoolkit.org/example/examples/dvdrental/lib/Frontend.php :21 Frontend Frontend->add("RentalAuth")
/www/agiletoolkit.org/example/atk4/lib/ApiCLI.php :48 Frontend Frontend->init()
/www/agiletoolkit.org/example/atk4/lib/ApiWeb.php :38 Frontend Frontend->__construct(Null)
/www/agiletoolkit.org/example/examples/dvdrental/index.php :3 Frontend Frontend->__construct()
乾杯。
アップデート
コード フラグメントは User クラスに入る必要があるため、次のようになります。
class Model_User extends Model_Table {
public $entity_code='user';
function init(){
parent::init();
$this->hasOne('Person');
$field_ref = $this->getField('person')->rename('person_str');
$this->getField('person_id')->dereferenced_field='person_str';
// add referenced Model
$m = $this->add('Model_Person');
$m->addField('name');
// Link referenced model field name to this model field.
$field_ref->setModel($m, 'name');
}
}
生成される SQL は次のとおりです。
select id
, person_id
,(select name
from person
where user
. person_id
= person
. id
) person_str
fromuser
ただし、以下のクラスも同じ SQL ステートメントを生成します。
class Model_User extends Model_Table {
public $entity_code='user';
function init(){
parent::init();
$this->hasOne('Person');
$this->getField('person')->rename('person_str');
}
}
そのため、関数と残りのコードの必要性がよくわかりません: $this->getField('person_id')->dereferenced_field='person_str';
// add referenced Model
$m = $this->add('Model_Person');
$m->addField('name');
// Link referenced model field name to this model field.
$field_ref->setModel($m, 'name');
これについてさらに説明をいただければ幸いです。ありがとうございます。