cakephp-如何从模型中获取数据->;型号->;模型类型关系
我有三种型号,设备,它们有许多预订,而反过来又有许多PaypalTransaction,我正试图找到属于预订的PaypalTransactions,它属于我正在处理的特定列表,并且是在不到一天前创建的。所有这些都在Listings控制器中 所以在我的列表控制器中cakephp-如何从模型中获取数据->;型号->;模型类型关系,php,cakephp,Php,Cakephp,我有三种型号,设备,它们有许多预订,而反过来又有许多PaypalTransaction,我正试图找到属于预订的PaypalTransactions,它属于我正在处理的特定列表,并且是在不到一天前创建的。所有这些都在Listings控制器中 所以在我的列表控制器中 $oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day')); $toBeConfdBookings = $this->Equipment->Booking->Paypa
$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day'));
$toBeConfdBookings = $this->Equipment->Booking->PaypalTransaction->find('all', array('conditions' => array('PaypalTransaction.created' > $oneDayAgo)));
所有的模型都具有蛋糕烘焙所创建的适当关系,但最终以$tobeconfdbooks结束的都是错误的
有人告诉我我做错了什么吗?按照您现在的方式,您基本上只需调用
PaypalTransaction
模型,并请求其find返回您最后一天的所有交易
$this->FirstModel->SecondModel->ThirdModel
并不意味着将结果从第一个模型连接到第二个模型,然后再连接到第三个模型,它只是帮助您加载链接模型的一种方法,而不是使用$this->loadModel('ThirdModel')
加载链接模型
因此,您仍然需要根据您想要执行的操作放置条件。例如,如果只是一个模型链接(假设$this->Booking设置为记录),则可以执行以下操作:
$this->Booking->PaypalTransaction->find('all', array(
'conditions' => array(
'PaypalTransaction.created >' => $oneDayAgo,
'PaypalTransaction.booking_id => $this->Booking->id
)
);
除非您的第三个模型包含前两个模型的键,否则您不能将其扩展到另外两个模型,我怀疑这两个模型都包含键(可能不应该)
CakePHP将在查找belongsTo和hasOne关联的条件中自动绑定模型,其余2种类型则需要自动绑定
这是一点额外的工作,但你很快就会习惯。在处理更深层次的关联时,我认为你应该看看这个链接。您可以按bindModel从表中检索数据
简单回答:
$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day'));
$this->loadModel('Booking'); // if neccessary
$paypalTransactions = $this->Booking->find('all', array(
'conditions' => array(
'Booking.equipment_id' => $equipmentId
),
'contain' => array(
'Equipment'
),
'joins' => array(
array('table' => 'paypal_transactions',
'alias' => 'PaypalTransaction',
'type' => 'INNER',
'conditions' => array(
'PaypalTransaction.booking_id = Booking.id',
"PaypalTransaction.created > '".$oneDayAgo."'"
)
)
));
您不能在三个这样深的模型上运行find()
。相反,尝试只加载模型,然后运行find()
:
(只能在加载的模型或与加载的模型直接相关的模型上运行find()
s。)
回答我第一次如何解释你的问题:
$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day'));
$this->loadModel('Booking'); // if neccessary
$paypalTransactions = $this->Booking->find('all', array(
'conditions' => array(
'Booking.equipment_id' => $equipmentId
),
'contain' => array(
'Equipment'
),
'joins' => array(
array('table' => 'paypal_transactions',
'alias' => 'PaypalTransaction',
'type' => 'INNER',
'conditions' => array(
'PaypalTransaction.booking_id = Booking.id',
"PaypalTransaction.created > '".$oneDayAgo."'"
)
)
));
通常,当您想要获取相关的结果时,它非常简单-只需使用
但是,您要做的是获取相关模型数据,并限制基于相关模型的结果。因此,因为Containable会创建单独的查询,所以您不能基于相关模型进行限制-在这种情况下,您需要利用连接
代码示例:
$oneDayAgo = date('Y-m-d H:i:s', strtotime('-1 day'));
$this->loadModel('Booking'); // if neccessary
$paypalTransactions = $this->Booking->find('all', array(
'conditions' => array(
'Booking.equipment_id' => $equipmentId
),
'contain' => array(
'Equipment'
),
'joins' => array(
array('table' => 'paypal_transactions',
'alias' => 'PaypalTransaction',
'type' => 'INNER',
'conditions' => array(
'PaypalTransaction.booking_id = Booking.id',
"PaypalTransaction.created > '".$oneDayAgo."'"
)
)
));
上面的代码基本上是这样的:
查找:查找$equipmentId
包含:还检索相关设备的数据(可选)
加入:将预订和Paypal交易的结果限制为仅在一天前发生交易的结果(并检索交易数据)
你所说的你想要的和你正在尝试的不相关-你想要的设备和/或预订的条件在哪里?可控制是一种方式,我也会推荐它