/**
  * Internal method.
  * Returns the many-to-many related rows of table $type for bean $bean using additional SQL in $sql and
  * $bindings bindings. If $getLinks is TRUE, link rows are returned instead.
  *
  * @param RedBean_OODBBean $bean     reference bean
  * @param string           $type     target type
  * @param boolean          $getLinks TRUE returns rows from the link table
  * @param string           $sql      additional SQL snippet
  * @param array            $bindings bindings
  *
  * @return array
  *
  * @throws RedBean_Exception_Security
  * @throws RedBean_Exception_SQL
  */
 private function relatedRows($bean, $type, $getLinks = FALSE, $sql = '', $bindings = array())
 {
     if (!is_array($bean) && !$bean instanceof RedBean_OODBBean) {
         throw new RedBean_Exception_Security('Expected array or RedBean_OODBBean but got:' . gettype($bean));
     }
     $ids = array();
     if (is_array($bean)) {
         $beans = $bean;
         foreach ($beans as $singleBean) {
             if (!$singleBean instanceof RedBean_OODBBean) {
                 throw new RedBean_Exception_Security('Expected RedBean_OODBBean in array but got:' . gettype($singleBean));
             }
             $ids[] = $singleBean->id;
         }
         $bean = reset($beans);
     } else {
         $ids[] = $bean->id;
     }
     $sourceType = $bean->getMeta('type');
     try {
         if (!$getLinks) {
             return $this->writer->queryRecordRelated($sourceType, $type, $ids, $sql, $bindings);
         } else {
             return $this->writer->queryRecordLinks($sourceType, $type, $ids, $sql, $bindings);
         }
     } catch (RedBean_Exception_SQL $exception) {
         $this->handleException($exception);
         return array();
     }
 }