morphTo(morphName) {
      if (!_.isString(morphName)) throw new Error('The `morphTo` name must be specified.');
      let columnNames, candidates;
      if (arguments[1] == null || (Array.isArray(arguments[1]) && _.isString(arguments[1][0]))) {
        columnNames = arguments[1] || null; // may be `null` or `undefined`
        candidates = _.drop(arguments, 2);
      } else {
        columnNames = null;
        candidates = _.drop(arguments, 1);
      }

      candidates = _.map(candidates, (target) => {
        if (Array.isArray(target)) return target;

        // Set up the morphValue by default as the tableName
        return [target, _.result(target.prototype, 'tableName')];
      });

      return this._relation('morphTo', null, {morphName, columnNames, candidates}).init(this);
    }
This relation is used to specify the inverse of the {@link Model#morphOne morphOne} or
{@link Model#morphMany morphMany} relations, where the `targets` must be passed to signify which
{@link Model models} are the potential opposite end of the {@link polymorphicRelation polymorphic relation}:

    const Photo = bookshelf.model('Photo', {
      tableName: 'photos',
      imageable() {
        return this.morphTo('imageable', 'Site', 'Post')
      }
    })

And with custom column names:

    const Photo = bookshelf.model('Photo', {
      tableName: 'photos',
      imageable() {
        return this.morphTo('imageable', ['ImageableType', 'ImageableId'], 'Site', 'Post')
      }
    })

And with custom morphValues, the inverse of the `morphValue` of {@link Model#morphOne morphOne} and
{@link Model#morphMany morphMany}, where the `morphValues` may be optionally set to check against a different
value in the `_type` column other than the {@link Model#tableName}, for example, a more descriptive name, or a
name that betters adheres to whatever standard you are using for models:

    const Photo = bookshelf.model('Photo', {
      tableName: 'photos',
      imageable() {
        return this.morphTo('imageable', ['Site', 'favicon'], ['Post', 'cover_photo'])
      }
    })

@method Model#morphTo
@param {string} name Prefix for `_id` and `_type` columns.
@param {string[]} [columnNames]
  Array containing two column names, where the first is the `_type` and the second is the `_id`.
@param {Model|string} [Target]
  Constructor of {@link Model} targeted by join. Can be a string specifying a previously registered model with
  {@link Bookshelf#model}.
@returns {Model} The related but empty model.