Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CakePHP匹配关联数据,并非所有值都返回_Php_Cakephp_Cakephp 3.x - Fatal编程技术网

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公里
我在包含的数据中缺少25公里的距离。 如何应用此过滤器,但要保持事件的所有距离

生成的SQL:

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,是的,它工作得很好。发现tablefield
Distances.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]);
    });