#php #laravel #polymorphism
#php #laravel #полиморфизм
Вопрос:
У меня есть приложение, в котором счет-фактура может принадлежать клиенту или поставщику. Теперь я использовал элементы морфинга в моем текущем сценарии. Я хочу создать правильный якорь, используя отношение morph, Но я не нашел лучшего способа с Laravel
Client.php
class Client extends Model
{
/**
* Get the client's invoices.
*/
public function invoices()
{
return $this->morphMany('AppInvoice', 'contact');
}
}
Supplier.php
class Supplier extends Model
{
/**
* Get the supplier's invoices.
*/
public function invoices()
{
return $this->morphMany('AppInvoice', 'contact');
}
}
Invoice.php
class Invoice extends Model
{
/**
* Get the owning contact model.
*/
public function contact()
{
return $this->morphTo();
}
}
Теперь где-нибудь (страница сведений о счете), где я хочу добавить привязку к контакту счета (поставщику или клиенту) Но мне нужно знать, есть ли какой-либо способ Laravel.
Если контакт счета-фактуры принадлежит App Client, то href будет «/ clients/contact_id», или если он принадлежит App Supplier, то он должен быть «/ supplier/contact_id»
invoices/show.blade.php
<a href=""><b>{{ $invoice->contact->name }}</b></a>
Ответ №1:
Вы можете попробовать данное решение для вашей проблемы.
<?php
//You can see here for all table migration files
// For Client Table
Schema::create('client', function (Blueprint $table) {
$table->increments('id');
$table->string("client_name");
$table->timestamps();
// You can add your more fields and you can change field name also
});
// For Supplier Table
Schema::create('supplier', function (Blueprint $table) {
$table->increments('id');
$table->string("supplier_name");
$table->timestamps();
// You can add your more fields and you can change field name also
});
// For Invoice Table
Schema::create('invoices', function (Blueprint $table) {
$table->increments('id');
$table->morphs('invoice');
$table->timestamps();
// You can add your more fields and you can change field name also
});
//Note:
$table→morphs('invoice') would automatically create two columns using the text passed to it “able”. So it will result in invoiceable_id and invoiceable_type.
?>
Вот ваша модель для репликации MorphTo
Модель клиента: Client.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Client extends Model
{
/**
* Get all of the Client's invoices.
*/
public function invoices()
{
return $this->morphMany(Invoices::class, 'invoiceable');
}
}
?>
Модель поставщика: Supplier.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Supplier extends Model
{
/**
* Get all of the Supplier's invoices.
*/
public function invoices()
{
return $this->morphMany(Invoices::class, 'invoiceable');
}
}
?>
Модель счетов: Invoices.php
<?php
namespace App;
use IlluminateDatabaseEloquentModel;
class Invoices extends Model
{
/**
* Get all of the owning invoiceable models.
*/
public function invoiceable()
{
return $this->morphTo();
}
}
?>
Теперь вы можете извлекать записи с помощью Client и Supplier, используя полиморфные отношения.
Извлекайте записи, используя клиентские модели.
$client = Client::find(1);
dd($client->invoices);
Извлеките записи, используя модели поставщиков.
$supplier = Supplier::find(1);
dd($supplier->invoices);
Вы также можете извлекать записи
$client = Client::find(1);
foreach ($client->invoices as $invoice) {
<a href="{{ route('view-client', ['id' => $invoice->id]) }}">
<b>{{ $invoice->client_name }}</b>
</a>
}
Комментарии:
1. Я думаю, что вы не видели актуальной проблемы. Я знаю, как получить данные из invoice или inverse. Мне нужно знать, что я хочу создать тег привязки, который ссылается на страницу сведений о контракте (клиент или поставщик)