如何为“All in One”方法设置复合主键(JS文件中定义的网格,以及使用php文件中的jqGridEdit类的数据)? 对我来说,对于我来说,表T的复合主键是一个基本主键,它定义了一些属于该表T的字段!
这是我的测试,但我没有数据,也无法使用CRUD操作:
在我的JS文件中,我有这行代码:
...
colModel:[
{name:"index",index:"index",label:"index"}, // <= THAT'S JUST THE INDEX OF MY TABLE
{name:"user",index:"user",label:"user",key:true}, // <= A PART OF MY COMPOSITE PRIMARY KEY
{name:"pwd",index:"pwd",label:"pwd",key:true}, // <= A PART OF MY COMPOSITE PRIMARY KEY
{name:"state",index:"state",label:"state",key:true}, // <= A PART OF MY COMPOSITE PRIMARY KEY
... <= AND SO ON
url:"mygrid_crud.php",
datatype:"json",
jsonReader:{repeatitems:false},
editurl: "mygrid_crud.php",
prmNames:{"id":"index"} // <= WHAT I NEED TO WRITE HERE ???
...
在我的php文件(mygrid_crud.php)中:
...
$grid = new jqGridEdit($conn);
$query = "SELECT * FROM mytable WHERE user='$user' and pwd='$pwd' and state='$state'..."; // <= SELECT * it's ok or i need to specify all fields i need ?
$grid->SelectCommand = $query;
$grid->dataType = "json";
$grid->table = 'mytable';
$grid->setPrimaryKeyId('index'); // <= WHAT I NEED TO WRITE HERE ???
...
$grid->editGrid();
请告诉我有什么问题,以及如何在这种方法中设置复合主键!?
非常感谢您的巡回回复。
所以,这是我经过大量努力后获得的解决方案;-(
这可能不是最佳解决方案,但添加,编辑和戴尔操作运行良好!!!
以下是具有COMPOSITE PRIMARY KEY的表定义示例:
CREATE TABLE `chat` (
`number` int(11) NOT NULL AUTO_INCREMENT,
`user` varchar(30) NOT NULL,
`pwd` varchar(100) NOT NULL,
`subject` varchar(100) NOT NULL,
`time` datetime NOT NULL,
`recipient` varchar(100) NOT NULL,
`message` varchar(1000) DEFAULT NULL,
PRIMARY KEY (`user`, `pwd`, `subject`, `time`, `recipient`),
UNIQUE KEY `number` (`number`)
)
所以要用网格来管理这样的表,我这样做。
在我的HTML文件中,我有以下代码行:
...
<table id='grid_chat'></table>
<div id='pager_chat'></div>
...
在我的PHP文件中,我有这行代码:
...
$grid = new jqGridRender($conn);
…
if($oper=="edit"){…}
elseif($oper=="del"){…}
…
$grid->setPrimaryKeyId('number');
…
// here i get the primary key for the new message i want to add
$chat = $_SESSION["chat"];
$user = $chat["user"];
$pwd = $chat["pwd"];
$subject = $chat["subject"];
…
$query = "SELECT * FROM chat WHERE user='$user' and pwd='$pwd' and subject='$subject'...”;
$grid->SelectCommand = $query;
…
// for the UNIQUE KEY (used for edit and dell operations)
$grid->setColProperty("number", array("hidden"=>true));
// for the COMPOSITE PRIMARY KEY (used for add operation)
$grid->setColProperty("user", array("hidden"=>true,"editoptions"=>array("value"=> $user),"editrules"=>array("required"=>true)));
$grid->setColProperty("pwd", array("hidden"=>true,"editoptions"=>array("value"=> $pwd),"editrules"=>array("required"=>true)));
$grid->setColProperty("subject", array("hidden"=>true,"editoptions"=>array("value"=> $subject),"editrules"=>array("required"=>true)));
$grid->setColProperty("time", array("hidden"=>true,"editoptions"=>array("value"=> $time),"editrules"=>array("required"=>true)));
$grid->setColProperty("recipient", array("hidden"=>true,"editoptions"=>array("value"=> $recipient),"editrules"=>array("required"=>true)));
// for the message
$grid->setColProperty("message", array("classes"=>"multiligne","label"=>"Message","width"=>400,"edittype"=>"textarea","editrules"=>array("required"=>true)));
// Set a new user datetime format using PHP convensions (for the php time variable)
$grid->setUserTime('Y-m-d H:i:s');
…
这不是“一体化”的方法,但效果很好!!
如果有人看到要优化的内容,请告诉我!!!
此致
Qualliarys
答案 0 :(得分:7)
首先,你发布的colModel
定义有些奇怪。例如,像colModel":[
这样的文本肯定是错误的。如果代码中包含很多错误(可能是格式错误,但读者不知道您的原始代码),很难说出代码。如果您在格式化数据时遇到问题,只需发布您拥有的内容,其他人就可以重新格式化您的问题。
现在谈谈你的主要问题。在一行中使用key:true
是错误的方法。在http://www.trirand.com/jqgridwiki/doku.php?id=wiki:colmodel_options上,您可以在以下key
参数的说明中找到:
如果服务器没有id, 这个可以设置为id 唯一的行ID。只有一列可以 有这个属性。如果有更多 网格找到第一个键而不是一个键 一,二被忽略。
jqGrid需要有一个id来区分一行网格和另一行网格。你可以用任何id,如1,2,3等填充jqGrid,这不是你真正的id。如果所有具有组成复合主键的信息的columnt在editable:true
中都有选项colModel
,那么这些列中的值将在所有编辑操作中发送到服务器,您将能够构建相应的mygrid_crud.php文件中的SELECT语句。
如果您不想显示仅需要构建复合键的某些列,可以使用colModel
hidden: true, editable: true, editrules: { edithidden: false }, hidedlg: true
它会使列对用户不可见,但数据将在所有编辑操作中发送到服务器。
最后还有一个小小的评论。不要在中设置默认值。例如,{name:"index", index:"index", label:"index"}
所有三个字段都相同。因此,您可以将所有内容减少到{name:"index"}
答案 1 :(得分:1)
也遇到了这个问题,并且有一个别人可能觉得有用的不同解决方案。
我真的不想为jqGrid更改我的表结构,所以我创建了一个复合键。
我的数据的主键是整数和日期的组合(它是每月销售目标的表格,因此日期有很大的分离)。我所做的是为json响应创建一个ID,它是两个部分的组合:
$response->rows[$line]['id'] = $id . "*" . $date;
然后,当编辑后的数据从jqGrid发回到页面时,传回的id确实类似于“79 * 2014-03-01”,这很容易拆分回访问数据以进行更新所需的部分