我在CakePHP 3.2中的UnitTest中收到错误消息,官方文档对我不再有帮助。我认为错误与我尝试使用的SQL-Joins有关。
错误消息如下:
private void control_MouseDown(object sender, MouseEventArgs e)
{
var control = sender as Control;
this.DoDragDrop(control.Name, DragDropEffects.Move);
}
private void panel_DragEnter(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent(typeof(string)))
return;
var name = e.Data.GetData(typeof(string)) as string;
var control = this.Controls.Find(name, true).FirstOrDefault();
if (control != null)
{
e.Effect = DragDropEffects.Move;
}
}
private void panel_DragDrop(object sender, DragEventArgs e)
{
if (!e.Data.GetDataPresent(typeof(string)))
return;
var name = e.Data.GetData(typeof(string)) as string;
var control = this.Controls.Find(name, true).FirstOrDefault();
if (control != null)
{
control.Parent.Controls.Remove(control);
var panel = sender as FlowLayoutPanel;
((FlowLayoutPanel)sender).Controls.Add(control);
}
}
在我的测试类`1) App\Test\TestCase\Controller\GetContentControllerTest::testIndex
PDOException: SQLSTATE[42S02]: Base table or view not found: 1146 Table 'contentmapper_test.CmDeviceclasses' doesn't exist`
中,我加载了我需要的灯具,并在开始时创建了我的数据库表:
GetContentControllerTest
在`public $fixtures = [
'app.cm_content_options',
'app.cm_content_addresses',
'app.cm_deviceclasses',
'app.cm_properties'
];`
- 方法我加载主表:
setUp()
我的测试方法`public function setUp()
{
parent::setUp();
$this->CmContentOptions = TableRegistry::get('CmContentOptions');
}`
如下所示:
testIndex()
public function testIndex()
{
//find the belonging ContentOption to address data
//submitted by the client
$this->testFindAllByUriAndDeviceclassAndBoxId();
assert($this->arrObjContentOptions->count() == 1);
}
看起来如下图所示(编辑器无法正确打印):
很难描述整个语境;我希望有可能理解。
错误恰好发生在图像中显示的语句中:
testFindAllByUriAandDeviceclassAndBoxID()
我想我只是忘了在$result = $query->toArray()
方法或其他类似内容中添加的内容。
我希望任何人都可以提供帮助。
答案 0 :(得分:0)
您的联接设置不正确,您正在混淆别名和表名。
别名是连接数组的键,table
键应该包含实际的数据库表名,而不是表类名。
鉴于您正在遵循数据库表名的CakePHP命名约定,您的连接设置应该更像这样
[
'CmDeviceclasses' => [ /* < this is the SQL alias */
'table' => 'cm_deviceclasses', /* < this is the database table name */
'type' => 'LEFT',
'conditions' => [
'CmDeviceclasses.classname' => $this->deviceclass
]
],
'CmContentAddresses' => [
'table' => 'cm_content_addresses',
'type' => 'INNER',
'conditions' => [
'CmContentAddresses.uri' => $this->uri,
'CmContentAddresses.boxid' => $this->boxid,
]
],
],
[
'CmDeviceclasses.classname' => 'string',
'CmContentAddresses.uri' => 'string',
'CmContentAddresses.boxid' => 'string'
]
对于别名,没有技术上需要遵循CamelCase约定,但是一般来说,遵守约定并不会造成伤害。
ps,如果你正确设置了关联,那么就不需要使用手动连接,只需使用Query::contain()
和Query::innerJoinWith()
或Query::matching()
。
见