Exemple #1
0
 /**
  * Merge the "wheres" from a relation query to a has query.
  *
  * @param  \Illuminate\Database\Eloquent\Builder  $hasQuery
  * @param  \Illuminate\Database\Eloquent\Relations\Relation  $relation
  * @return void
  */
 protected function mergeWheresToHas(Builder $hasQuery, Relation $relation)
 {
     // Here we have the "has" query and the original relation. We need to copy over any
     // where clauses the developer may have put in the relationship function over to
     // the has query, and then copy the bindings from the "has" query to the main.
     $relationQuery = $relation->getBaseQuery();
     $hasQuery->mergeWheres($relationQuery->wheres, $relationQuery->getBindings());
     $this->query->mergeBindings($hasQuery->getQuery());
 }
 /**
  * Update counter cache column.
  *
  * @author Morten Rugaard <*****@*****.**>
  *
  * @param  \Illuminate\Database\Eloquent\Model              $model
  * @param  \Illuminate\Database\Eloquent\Relations\Relation $relation
  * @param  array|null                                       $counterCacheConditions
  * @param  string                                           $foreignKey
  * @param  string                                           $counterCacheColumnName
  * @return bool
  */
 protected function updateCount(IlluminateModel $model, IlluminateRelation $relation, $counterCacheConditions, $foreignKey, $counterCacheColumnName)
 {
     // Retrieve table name of relation
     $relationTableName = $relation->getModel()->getTable();
     // Generate query builder for counting entries
     // on our model. Result will be used as value when
     // we're updating the counter cache column on the relation
     $countQuery = $model->newQuery()->select(DB::raw(sprintf('COUNT(%s.id)', $model->getTable())))->join(DB::raw(sprintf('(SELECT %s.%s FROM %s) as relation', $relationTableName, $relation->getOtherKey(), $relationTableName)), $relation->getQualifiedForeignKey(), '=', sprintf('relation.%s', $relation->getOtherKey()))->where($relation->getQualifiedForeignKey(), '=', $this->prepareValue($foreignKey));
     // If our relation has additional conditions, we'll need
     // to add them to our query builder that counts the entries
     if (is_array($counterCacheConditions)) {
         foreach ($counterCacheConditions as $conditionType => $conditionParameters) {
             foreach ($conditionParameters as $parameters) {
                 call_user_func_array([$countQuery, $conditionType], $parameters);
             }
         }
     }
     // Retrieve countQuery SQL
     // and prepare for binding replacements
     $countQuerySql = str_replace(['%', '?'], ['%%', '%s'], $countQuery->toSql());
     // Fire the update query
     // to update counter cache column
     return (bool) $relation->getBaseQuery()->update([sprintf('%s.%s', $relationTableName, $counterCacheColumnName) => DB::raw(sprintf('(%s)', vsprintf($countQuerySql, $countQuery->getBindings())))]);
 }