morphOne(Target, name, columnNames, morphValue) {
      return this._morphOneOrMany(Target, name, columnNames, morphValue, 'morphOne');
    }
The {@link Model#morphOne morphOne} is used to signify a {@link oneToOne
one-to-one} {@link polymorphicRelation polymorphic relation} with
another `Target` model, where the `name` of the model is used to determine
which database table keys are used. The naming convention requires the
`name` prefix an `_id` and `_type` field in the database. So for the case
below the table names would be `imageable_type` and `imageable_id`. The
`morphValue` may be optionally set to store/retrieve a different value in
the `_type` column than the {@link Model#tableName}.

    let Site = bookshelf.model('Site', {
      tableName: 'sites',
      photo: function() {
        return this.morphOne('Photo', 'imageable');
      }
    });

And with custom `columnNames`:

    let Site = bookshelf.model('Site', {
      tableName: 'sites',
      photo: function() {
        return this.morphOne('Photo', 'imageable', ['ImageableType', 'ImageableId']);
      }
    });

Note that both `columnNames` and `morphValue` are optional arguments. How
your argument is treated when only one is specified, depends on the type.
If your argument is an array, it will be assumed to contain custom
`columnNames`. If it's not, it will be assumed to indicate a `morphValue`.

@method Model#morphOne
@param {Model|string} Target
  Constructor of {@link Model} targeted by join. Can be a string specifying a previously registered model with
  {@link Bookshelf#model}.
@param {string} [name] Prefix for `_id` and `_type` columns.
@param {(string[])} [columnNames]
  Array containing two column names, the first is the `_type` while the second is the `_id`.
@param {string} [morphValue=Target#{@link Model#tableName tableName}]
  The string value associated with this relationship. Stored in the `_type` column of the polymorphic table.
  Defaults to `Target#{@link Model#tableName tableName}`.
@returns {Model} The related model.