Laravel 4: Яркие мягкие удаления и отношения

У меня есть 2 таблицы, клиенты и проекты, и проект связан с клиентом. И клиенты, и проекты реализуют мягкие удаления для поддержания отношений по причинам архива, т.е. Даже если я удалю клиента, проект все равно будет прикреплен к информации о клиенте.

Моя проблема заключается в том, что при удалении клиента ссылка становится недоступной из проекта и выдает исключение. То, что я хотел бы сделать, - это мягкое удаление клиента, но сохранение данных клиента из отношения проекта.

Мой левый код выглядит следующим образом:

@if ($projects->count())
<table class="table table-striped table-bordered">
    <thead>
        <tr>
            <th>Name</th>
            <th>Client</th>
        </tr>
    </thead>

    <tbody>
        @foreach ($projects as $project)
            <tr>
                <td>{{{ $project->name }}}</td>
                <td>{{{ $project->client->name }}}</td>
                <td>{{ link_to_route('projects.edit', 'Edit', array($project->id), array('class' => 'btn btn-info')) }}</td>
                <td>
                    {{ Form::open(array('method' => 'DELETE', 'route' => array('projects.destroy', $project->id))) }}
                        {{ Form::submit('Delete', array('class' => 'btn btn-danger')) }}
                    {{ Form::close() }}
                </td>
            </tr>
        @endforeach
    </tbody>
</table> @else There are no projects @endif

Ниже перечислены миграции:

        Schema::create('clients', function(Blueprint $table) {

        // Table engine
        $table->engine = 'InnoDB';

        // Increments
        $table->increments('id');

        // Relationships

        // Fields
        $table->string('name');

        // Timestamps
        $table->timestamps();

        // Soft deletes
        $table->softDeletes();

    });


        Schema::create('projects', function(Blueprint $table) {

        // Table engine
        $table->engine = 'InnoDB';

        // Increments
        $table->increments('id');

        // Relationships
        $table->integer ('client_id');

        // Fields
        $table->string('name');

        // Timestamps
        $table->timestamps();

        // Soft deletes
        $table->softDeletes();

        // Indexes
        $table->index('client_id');


    });

Большое спасибо.

Ответ 1

Это было решено с помощью метода withTrashed() при определении отношения в модели.

Исходный код:

public function client() {
    return $this->belongsTo('Client');
}

Решение:

public function client() {
    return $this->belongsTo('Client')->withTrashed();
}

Большое спасибо Glad To Help.

Ответ 2

В моем случае я не могу изменить функцию client по предложению Wally, потому что она используется в других моделях и контроллерах, что я не хочу, чтобы он получал Клиенты ->withTrashed().

В этом случае мы предлагаем два решения:

Укажите ->withTrashed() при загрузке клиента:

$projects = Project::with(['client' => function($query){ $query->withTrashed(); }])->get();

Или создайте новые функции client ->withTrashed()

public function client() {
    return $this->belongsTo('Client');
}

// The new function
public function client_with_trash() {
    return $this->belongsTo('Client')->withTrashed();
}

При загрузке сейчас:

$projects = Project::with(['client_with_trash'])->get();