app/Models/Account/Place.php (65 lines of code) (raw):
<?php
namespace App\Models\Account;
use App\Models\Contact\Contact;
use function Safe\preg_replace;
use App\Helpers\CountriesHelper;
use App\Models\ModelBinding as Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
/**
* A Place is not the same as an address.
* An Address in Monica is a way of contacting the contact. An Address is linked
* to a Place. But Places can exist without the Address object.
* Places will be linked to activities, for instance.
*/
class Place extends Model
{
/**
* The table associated with the model.
*
* @var string
*/
protected $table = 'places';
/**
* The attributes that aren't mass assignable.
*
* @var array
*/
protected $guarded = ['id'];
/**
* Get the account record associated with the place.
*
* @return BelongsTo
*/
public function account()
{
return $this->belongsTo(Account::class);
}
/**
* Get the Weather record associated with the place.
*
* @return HasMany
*/
public function weathers()
{
return $this->hasMany(Weather::class);
}
/**
* Get the address as a sentence.
*
* @return string|null
*/
public function getAddressAsString(): ?string
{
$address = '';
if (! is_null($this->street)) {
$address = $this->street;
}
if (! is_null($this->city)) {
$address .= ' '.$this->city;
}
if (! is_null($this->province)) {
$address .= ' '.$this->province;
}
if (! is_null($this->postal_code)) {
$address .= ' '.$this->postal_code;
}
if (! is_null($this->country)) {
$address .= ' '.$this->getCountryName();
}
if (empty($address)) {
return null;
}
// trim extra whitespaces inside the address
$address = preg_replace('/\s+/', ' ', $address);
if (is_string($address)) {
return $address;
}
return null;
}
/**
* Get the country of the place.
*
* @return string|null
*/
public function getCountryName(): ?string
{
if ($this->country) {
return CountriesHelper::get($this->country);
}
return null;
}
/**
* Get an URL for Google Maps for the place.
*
* @return string
*/
public function getGoogleMapAddress()
{
$place = $this->getAddressAsString();
$place = urlencode($place);
return "https://www.google.com/maps/place/{$place}";
}
/**
* Get the Google Maps url for the latitude/longitude.
*
* @return string
*/
public function getGoogleMapsAddressWithLatitude()
{
return 'http://maps.google.com/maps?q='.$this->latitude.','.+$this->longitude;
}
}