Overview

Namespaces

  • LeanCloud
    • Engine
    • Operation
    • Storage
    • Uploader

Classes

  • LeanCloud\ACL
  • LeanCloud\AppRouter
  • LeanCloud\Bytes
  • LeanCloud\Client
  • LeanCloud\Engine\Cloud
  • LeanCloud\Engine\LaravelEngine
  • LeanCloud\Engine\LeanEngine
  • LeanCloud\Engine\SlimEngine
  • LeanCloud\File
  • LeanCloud\GeoPoint
  • LeanCloud\LeanObject
  • LeanCloud\MIMEType
  • LeanCloud\Operation\ArrayOperation
  • LeanCloud\Operation\DeleteOperation
  • LeanCloud\Operation\IncrementOperation
  • LeanCloud\Operation\RelationOperation
  • LeanCloud\Operation\SetOperation
  • LeanCloud\Push
  • LeanCloud\Query
  • LeanCloud\Region
  • LeanCloud\Relation
  • LeanCloud\Role
  • LeanCloud\RouteCache
  • LeanCloud\SaveOption
  • LeanCloud\SMS
  • LeanCloud\Storage\CookieStorage
  • LeanCloud\Storage\SessionStorage
  • LeanCloud\Uploader\QCloudUploader
  • LeanCloud\Uploader\QiniuUploader
  • LeanCloud\Uploader\S3Uploader
  • LeanCloud\Uploader\SimpleUploader
  • LeanCloud\User

Interfaces

  • LeanCloud\Operation\IOperation
  • LeanCloud\Storage\IStorage

Exceptions

  • LeanCloud\BatchRequestError
  • LeanCloud\CloudException
  • LeanCloud\Engine\FunctionError
  • Overview
  • Namespace
  • Class
  1:   2:   3:   4:   5:   6:   7:   8:   9:  10:  11:  12:  13:  14:  15:  16:  17:  18:  19:  20:  21:  22:  23:  24:  25:  26:  27:  28:  29:  30:  31:  32:  33:  34:  35:  36:  37:  38:  39:  40:  41:  42:  43:  44:  45:  46:  47:  48:  49:  50:  51:  52:  53:  54:  55:  56:  57:  58:  59:  60:  61:  62:  63:  64:  65:  66:  67:  68:  69:  70:  71:  72:  73:  74:  75:  76:  77:  78:  79:  80:  81:  82:  83:  84:  85:  86:  87:  88:  89:  90:  91:  92:  93:  94:  95:  96:  97:  98:  99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 
<?php

namespace LeanCloud;

use LeanCloud\Operation\RelationOperation;

/**
 * Many-to-many relationship for LeanObject
 *
 * A relation consists of an array of objects, of which items can be
 * added to, and removed from. Each field could only have one kind of
 * object.
 */
class Relation {
    /**
     * The parent object of relation.
     *
     * @var LeanObject
     */
    private $parent;

    /**
     * The parent field key of relation.
     *
     * @var string
     */
    private $key;

    /**
     * The target className of relation.
     *
     * @var string
     */
    private  $targetClassName;

    /**
     * Initialize relation
     *
     * Build a relation on parent field. It shall be rarely used
     * directly, use `$parent->getRelation($key)` instead.
     *
     * @param LeanObject $parent    Parent object
     * @param string     $key       Field key on parent object
     * @param string     $className ClassName the object relatedTo
     */
    public function __construct($parent, $key, $className=null) {
        $this->parent          = $parent;
        $this->key             = $key;
        $this->targetClassName = $className;
    }

    /**
     * Encode to JSON representation of relation.
     *
     * @return array
     */
    public function encode() {
        return array("__type"    => "Relation",
                     "className" => $this->targetClassName);
    }

    /**
     * Attempt to set and validate parent of relation
     *
     * @param LeanObject $parent Parent object of relation
     * @param string     $key    Field key
     * @throws RuntimeException
     */
    public function setParentAndKey($parent, $key) {
        if ($this->parent && $this->parent != $parent) {
            throw new \RuntimeException("Relation does not belong to the object");
        }
        if ($this->key && $this->key != $key) {
            throw new \RuntimeException("Relation does not belong to the field");
        }
        $this->parent = $parent;
        $this->key    = $key;
    }

    /**
     * Get target className of relation
     *
     * @return string
     */
    public function getTargetClassName() {
        return $this->targetClassName;
    }

    /**
     * Add object(s) to the field as relation
     *
     * @param object|array $objects LeanObject(s) to add
     */
    public function add($objects) {
        if (!is_array($objects)) { $objects = array($objects); }
        $op = new RelationOperation($this->key, $objects, null);
        $this->parent->set($this->key, $op);
        if (!$this->targetClassName) {
            $this->targetClassName = $op->getTargetClassName();
        }
    }

    /**
     * Remove object(s) from the field
     *
     * @param object|array $objects LeanObject(s) to remove
     */
    public function remove($objects) {
        if (!is_array($objects)) { $objects = array($objects); }
        $op = new RelationOperation($this->key, null, $objects);
        $this->parent->set($this->key, $op);
        if (!$this->targetClassName) {
            $this->targetClassName = $op->getTargetClassName();
        }
    }

    /**
     * Query on the target class of relation
     *
     * @return Query
     */
    public function getQuery() {
        if ($this->targetClassName) {
            $query = new Query($this->targetClassName);
        } else {
            $query = new Query($this->parent->getClassName());
            $query->addOption("redirectClassNameForKey", $this->key);
        }
        $query->relatedTo($this->key, $this->parent);
        return $query;
    }

    /**
     * Query on the parent class where child is in the relation
     *
     * @param LeanObject $child  Child object
     * @return Query
     */
    public function getReverseQuery(LeanObject $child) {
        $query = new Query($this->parent->getClassName());
        $query->equalTo($this->key, $child->getPointer());
        return $query;
    }

}

API documentation generated by ApiGen