CakePHP匹配关联数据,并非所有值都返回
我有项目和距离,模型是这样的: 具有以下事件(和距离)CakePHP匹配关联数据,并非所有值都返回,php,cakephp,cakephp-3.x,Php,Cakephp,Cakephp 3.x,我有项目和距离,模型是这样的: 具有以下事件(和距离) 事件1:25公里,500公里 活动2:25公里 事件3:100公里 我试图选择在给定的最小距离和最大距离之间至少有一个距离的所有事件。因此,我使用以下代码: $mindistance = 50; $maxdistance = 550; $events = $this->Events ->find() ->contain(['Distances']) ->matching('Distance
- 事件1:25公里,500公里
- 活动2:25公里
- 事件3:100公里
$mindistance = 50;
$maxdistance = 550;
$events = $this->Events
->find()
->contain(['Distances'])
->matching('Distances', function ($q) use ($maxdistance, $mindistance) {
return $q->where(['Distances.title <=' => $maxdistance, 'Distances.title >=' => $mindistance]);
});
$mindistance=50;
$maxdistance=550;
$events=$this->events
->查找()
->包含(['distance']))
->匹配('distance',函数($q)使用($maxdistance,$mindistance){
返回$q->where(['distance.title='=>$mindistance]);
});
这让我回想起:
- 事件1:500公里
- 事件3:100公里
SELECT
Events.id AS Events__id,
Events.user_id AS Events__user_id,
Events.title AS Events__title,
Events.slug AS Events__slug,
Events.type AS Events__type,
Events.description AS Events__description,
Events.datetime AS Events__datetime,
Events.country AS Events__country,
Events.province AS Events__province,
Events.city AS Events__city,
Events.street AS Events__street,
Events.housenumber AS Events__housenumber,
Events.zipcode AS Events__zipcode,
Events.lat AS Events__lat,
Events.lon AS Events__lon,
Events.price AS Events__price,
Events.active AS Events__active,
Events.created AS Events__created,
Events.modified AS Events__modified,
DistancesEvents.distance_id AS DistancesEvents__distance_id,
DistancesEvents.event_id AS DistancesEvents__event_id,
Distances.id AS Distances__id,
Distances.title AS Distances__title,
Distances.created AS Distances__created,
Distances.modified AS Distances__modified
FROM
events Events
INNER JOIN distances_events DistancesEvents ON Events.id = (DistancesEvents.event_id)
INNER JOIN distances Distances ON (
Distances.title <= '550'
AND Distances.title >= '50'
AND Distances.id = (DistancesEvents.distance_id)
)
SELECT
DistancesEvents.distance_id AS Distances_CJoin__distance_id,
DistancesEvents.event_id AS Distances_CJoin__event_id,
Distances.id AS Distances__id,
Distances.title AS Distances__title,
Distances.created AS Distances__created,
Distances.modified AS Distances__modified
FROM
distances Distances
INNER JOIN distances_events DistancesEvents ON Distances.id = (DistancesEvents.distance_id)
WHERE
DistancesEvents.event_id in (8, 10)
选择
Events.id作为Events\uu id,
Events.user\u id作为Events\u user\u id,
Events.title作为事件标题,
Events.slug作为Events\uuu slug,
Events.type作为事件类型,
Events.description作为事件描述,
Events.datetime作为Events\uu datetime,
Events.country作为Events\uuuu country,
Events.province作为Events\uuuu省,
Events.city作为Events\uuuu city,
Events.street作为Events___街,
Events.housenumber作为Events\uuu housenumber,
Events.zipcode作为Events_uzipcode,
Events.lat作为Events\uuu lat,
Events.lon作为事件,
Events.price作为事件价格,
Events.active作为Events\uuuu active,
Events.created为Events\uuuu created,
Events.modified为Events\uuuu modified,
DistancesEvents.distance\u id作为DistancesEvents\u distance\u id,
DistancesEvents.event\u id作为DistancesEvents\u event\u id,
distance.id作为distance\uu id,
距离.title作为距离\uuuu title,
距离。创建为距离,
距离。修改为距离\修改
从…起
事件
内部连接距离\u events.id=(DistancesEvents.event\u id)上的事件距离
上的内部连接距离(
distance.title='50'
和distance.id=(distance sevents.distance_id)
)
挑选
DistancesEvents.distance\u id作为距离\u CJoin\u距离\u id,
距离事件id作为距离事件id,
distance.id作为distance\uu id,
距离.title作为距离\uuuu title,
距离。创建为距离,
距离。修改为距离\修改
从…起
距离
内部连接距离\u事件距离distance.id=(DistancesEvents.distance\u id)
哪里
DistancesEvents.event_id in(8,10)
在EventsTable中创建两个距离关系,第一个用于匹配,第二个用于所有距离:
/* EventsTable.php */
class EventsTable extends Table
{
public function initialize(array $config): void
{
...
$this->belongsToMany('MatchedDistances', [
'foreignKey' => 'event_id',
'targetForeignKey' => 'distance_id',
'joinTable' => 'distances_events',
'dependent' => true
]);
$this->belongsToMany('Distances', [
'foreignKey' => 'event_id',
'targetForeignKey' => 'distance_id',
'joinTable' => 'distances_events',
'dependent' => true
]);
然后:
$mindistance=50;
$maxdistance=550;
$events=$this->events
->查找()
->包含(['MatchedDistances'])
->包含(['distance']))
->匹配('MatchedDistances',函数($q)使用($maxdistance,$MindDistance){
返回$q->where(['MatchedDistances.title='=>$MindDistance]);
});
您的确切CakePHP版本是什么?这真的是您查询的所有代码吗?您是如何测试影响结果的匹配的?获取相关记录的生成SQL是什么样子的?@ndm,我使用的是3.8.10;我已将生成的SQL添加到问题中。将数字与明显的字符串列进行比较是关于,但它不应该影响关联查询或其结果的合并。我无法重现您的问题,使用3.8.10
匹配和包含使用您的配置在这里工作得很好。@ndm,是的,它工作得很好。发现tablefieldDistances.title
是varchar
而不是int
谢谢你的支持。我的代码确实有效。它是一个数据库表字段(distance.title
)是一个varchar而不是int
/* EventsTable.php */
class EventsTable extends Table
{
public function initialize(array $config): void
{
...
$this->belongsToMany('MatchedDistances', [
'foreignKey' => 'event_id',
'targetForeignKey' => 'distance_id',
'joinTable' => 'distances_events',
'dependent' => true
]);
$this->belongsToMany('Distances', [
'foreignKey' => 'event_id',
'targetForeignKey' => 'distance_id',
'joinTable' => 'distances_events',
'dependent' => true
]);
$mindistance = 50;
$maxdistance = 550;
$events = $this->Events
->find()
->contain(['MatchedDistances'])
->contain(['Distances'])
->matching('MatchedDistances', function ($q) use ($maxdistance, $mindistance) {
return $q->where(['MatchedDistances.title <=' => $maxdistance, 'MatchedDistances.title >=' => $mindistance]);
});