original_string: protected function _saveLinks(EntityInterface $sourceEntity, $targetEntities, $options)
      {
          $target = $this->getTarget();
          $junction = $this->junction();
          $entityClass = $junction->getEntityClass();
          $belongsTo = $junction->getAssociation($target->getAlias());
          $foreignKey = (array)$this->getForeignKey();
          $assocForeignKey = (array)$belongsTo->getForeignKey();
          $targetPrimaryKey = (array)$target->getPrimaryKey();
          $bindingKey = (array)$this->getBindingKey();
          $jointProperty = $this->_junctionProperty;
          $junctionRegistryAlias = $junction->getRegistryAlias();
  
          foreach ($targetEntities as $e) {
              $joint = $e->get($jointProperty);
              if (!$joint || !($joint instanceof EntityInterface)) {
                  $joint = new $entityClass([], ['markNew' => true, 'source' => $junctionRegistryAlias]);
              }
              $sourceKeys = array_combine($foreignKey, $sourceEntity->extract($bindingKey));
              $targetKeys = array_combine($assocForeignKey, $e->extract($targetPrimaryKey));
  
              $changedKeys = (
                  $sourceKeys !== $joint->extract($foreignKey) ||
                  $targetKeys !== $joint->extract($assocForeignKey)
              );
              // Keys were changed, the junction table record _could_ be
              // new. By clearing the primary key values, and marking the entity
              // as new, we let save() sort out whether or not we have a new link
              // or if we are updating an existing link.
              if ($changedKeys) {
                  $joint->isNew(true);
                  $joint->unsetProperty($junction->getPrimaryKey())
                      ->set(array_merge($sourceKeys, $targetKeys), ['guard' => false]);
              }
              $saved = $junction->save($joint, $options);
  
              if (!$saved && !empty($options['atomic'])) {
                  return false;
              }
  
              $e->set($jointProperty, $joint);
              $e->setDirty($jointProperty, false);
          }
  
          return true;
      }
code: protected function _saveLinks(EntityInterface $sourceEntity, $targetEntities, $options)
      {
          $target = $this->getTarget();
          $junction = $this->junction();
          $entityClass = $junction->getEntityClass();
          $belongsTo = $junction->getAssociation($target->getAlias());
          $foreignKey = (array)$this->getForeignKey();
          $assocForeignKey = (array)$belongsTo->getForeignKey();
          $targetPrimaryKey = (array)$target->getPrimaryKey();
          $bindingKey = (array)$this->getBindingKey();
          $jointProperty = $this->_junctionProperty;
          $junctionRegistryAlias = $junction->getRegistryAlias();
  
          foreach ($targetEntities as $e) {
              $joint = $e->get($jointProperty);
              if (!$joint || !($joint instanceof EntityInterface)) {
                  $joint = new $entityClass([], ['markNew' => true, 'source' => $junctionRegistryAlias]);
              }
              $sourceKeys = array_combine($foreignKey, $sourceEntity->extract($bindingKey));
              $targetKeys = array_combine($assocForeignKey, $e->extract($targetPrimaryKey));
  
              $changedKeys = (
                  $sourceKeys !== $joint->extract($foreignKey) ||
                  $targetKeys !== $joint->extract($assocForeignKey)
              );
              // Keys were changed, the junction table record _could_ be
              // new. By clearing the primary key values, and marking the entity
              // as new, we let save() sort out whether or not we have a new link
              // or if we are updating an existing link.
              if ($changedKeys) {
                  $joint->isNew(true);
                  $joint->unsetProperty($junction->getPrimaryKey())
                      ->set(array_merge($sourceKeys, $targetKeys), ['guard' => false]);
              }
              $saved = $junction->save($joint, $options);
  
              if (!$saved && !empty($options['atomic'])) {
                  return false;
              }
  
              $e->set($jointProperty, $joint);
              $e->setDirty($jointProperty, false);
          }
  
          return true;
      }
code_tokens: protected function _saveLinks ( EntityInterface $ sourceEntity , $ targetEntities , $ options ) { $ target = $ this -> getTarget ( ) ; $ junction = $ this -> junction ( ) ; $ entityClass = $ junction -> getEntityClass ( ) ; $ belongsTo = $ junction -> getAssociation ( $ target -> getAlias ( ) ) ; $ foreignKey = ( array ) $ this -> getForeignKey ( ) ; $ assocForeignKey = ( array ) $ belongsTo -> getForeignKey ( ) ; $ targetPrimaryKey = ( array ) $ target -> getPrimaryKey ( ) ; $ bindingKey = ( array ) $ this -> getBindingKey ( ) ; $ jointProperty = $ this -> _junctionProperty ; $ junctionRegistryAlias = $ junction -> getRegistryAlias ( ) ; foreach ( $ targetEntities as $ e ) { $ joint = $ e -> get ( $ jointProperty ) ; if ( ! $ joint || ! ( $ joint instanceof EntityInterface ) ) { $ joint = new $ entityClass ( [ ] , [ 'markNew' => true , 'source' => $ junctionRegistryAlias ] ) ; } $ sourceKeys = array_combine ( $ foreignKey , $ sourceEntity -> extract ( $ bindingKey ) ) ; $ targetKeys = array_combine ( $ assocForeignKey , $ e -> extract ( $ targetPrimaryKey ) ) ; $ changedKeys = ( $ sourceKeys !== $ joint -> extract ( $ foreignKey ) || $ targetKeys !== $ joint -> extract ( $ assocForeignKey ) ) ; // Keys were changed, the junction table record _could_ be // new. By clearing the primary key values, and marking the entity // as new, we let save() sort out whether or not we have a new link // or if we are updating an existing link. if ( $ changedKeys ) { $ joint -> isNew ( true ) ; $ joint -> unsetProperty ( $ junction -> getPrimaryKey ( ) ) -> set ( array_merge ( $ sourceKeys , $ targetKeys ) , [ 'guard' => false ] ) ; } $ saved = $ junction -> save ( $ joint , $ options ) ; if ( ! $ saved && ! empty ( $ options [ 'atomic' ] ) ) { return false ; } $ e -> set ( $ jointProperty , $ joint ) ; $ e -> setDirty ( $ jointProperty , false ) ; } return true ; }
docstring: Creates links between the source entity and each of the passed target entities
  
  @param \Cake\Datasource\EntityInterface $sourceEntity the entity from source table in this
  association
  @param array $targetEntities list of entities to link to link to the source entity using the
  junction table
  @param array $options list of options accepted by `Table::save()`
  @return bool success
docstring_tokens: Creates links between the source entity and each of the passed target entities