database - has - laravel updateorcreate



쉼표로 분리 된 ID와 짝이없는 관계를 모방하는 방법 (1)

내 첫 번째 제안은 DB를 정상화하는 것 입니다. Eloquent ORM의 컨텍스트에서이 작업을 위해 기본 제공 관계를 사용할 수 없습니다.

그러나 호기심을 위해서 다음과 같이해야합니다.

아래 설정을 통해 다음을 수행 할 수 있습니다.

// 1. Use layers like eloquent dynamic property
$order->layers; // collection of Layer models

// 2. Call the query to fetch layers only once
$order->layers; // query and set 'relation'
// ... more code
$order->layers; // no query, accessing relation

// 3. Further query layers like you would with relationship as method:
$order->layers()->where(..)->orderBy(..)->...->get();

// 4. Associate layers manually providing either array or string:
$order->layer_ids = '1,5,15';
$order->layer_ids = [1,5,15];

그러나 당신은 할 수 없습니다 :

// 1. Eager/Lazy load the layers for multiple orders
$orders = Order::with('layers')->get(); // WON'T WORK

// 2. Use any of the relationship methods for associating/saving/attaching etc.
$order->layers()->associate(..); // WON'T WORK

그러나 여기에 할 수있는 것이 있습니다 ( layer_id 이름을 layer_id 로 변경하여 자체적으로 설명 할 수 있도록 제안합니다. 예를 들어 그 변경 사항을 다룰 수 있습니다).

/**
 * Accessor that mimics Eloquent dynamic property.
 *
 * @return \Illuminate\Database\Eloquent\Collection
 */
public function getLayersAttribute()
{
    if (!$this->relationLoaded('layers')) {
        $layers = Layer::whereIn('id', $this->layer_ids)->get();

        $this->setRelation('layers', $layers);
    }

    return $this->getRelation('layers');
}

/**
 * Access layers relation query.
 *
 * @return \Illuminate\Database\Eloquent\Builder
 */
public function layers()
{
    return Layer::whereIn('id', $this->layer_ids);
}

/**
 * Accessor for layer_ids property.
 *
 * @return array
 */
public function getLayerIdsAttribute($commaSeparatedIds)
{
    return explode(',', $commaSeparatedIds);
}

/**
 * Mutator for layer_ids property.
 *
 * @param  array|string $ids
 * @return void
 */
public function setLayersIdsAttribute($ids)
{
    $this->attributes['layers_ids'] = is_string($ids) ? $ids : implode(',', $ids);
}

편집 : 물론 당신은 당신의 견해에서 이것을 간단히 할 수 있습니다. 그것은 현재 코드를 준수하지만 분명히 내가 제안한 것과는 거리가 멀다.)

@foreach (Layer::whereIn('id', explode(',', $order->layer_id))->get() as $layer)
  {{ $layer->whatever }}

두 개의 테이블, 주문 및 레이어가 있습니다. 내 주문 테이블에서 나는 그것을 varchar로 설정 한 layer_id에 배열을 저장합니다. 나는 그것을 먼저 폭발시키고 나는 기록을 보여준다. 내가 원하는 것은 레이어 테이블에서 레코드를 표시하는 것입니다 (예 : layer_name 열의 이름). 나는 또한 그들의 관계를 설정했습니다. 어떤 제안이라도 고맙게 생각합니다.

내 컨트롤러 :

public function getCheckout(){
    $orders = Order::get();
    return View::make('checkout')->with('orders', $orders);
}

내 견해 :

@forelse($orders as $order)

<div class="panel panel-default">
    <div class="panel-heading">
        <h3 class="panel-title">{{ $order->style_id }}</h3>
    </div>
    <div class="panel-body">
    <p>Layers you chose</p>

    <table class="table">
        <tr>
        <td>ID</td>
        @foreach(explode(',', $order->layer_id) as $layer) 
            <td>{{ $layer }}</td>
        @endforeach
        </tr>

    </table>
</div>
    <div class="panel-footer"><button class="btn btn-primary">Confirm</button></div>
</div>

@empty

<p>Nothing to display</p>

@endforelse

내 모델

Class Order extends Eloquent {
    public function layer() {
        return $this->belongsTo('Layer', 'layer_id');
    }
}




eloquent