создайте тег привязки, используя отношение морфинга в представлении блейда Laravel

#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:
$tablemorphs('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. Мне нужно знать, что я хочу создать тег привязки, который ссылается на страницу сведений о контракте (клиент или поставщик)