web-dev-qa-db-ja.com

Laravelの選択クエリに値を含む新しい列を追加します

Laravelで選択結合を行いながら、「type」というデフォルト変数を作成し、値を「car」に設定する方法を知りたいです。

これまでの私のコードは次のとおりです。

$items = DB::table('items')->orderBy('created_at', 'desc')
                           ->join('items_categories', 'items.item_category_id', '=', 'items_categories.category_id')
                           ->select( 
                                     'items.id as items___item_id',
                                     'items.item_title as items___item_title',
                                     'items_categories.id as items_categories___category_id',
                                     'items_categories.title as items_categories___category_title',
                                   )
                           ->take(20);

これはうまくいきます。ただし、この選択の各レコードのカスタムキーと値を取得/追加する必要があるので、後でテンプレートでそれを使用して、さらにフィルタリングできます。

したがって、typeというキーとcarの値を追加する必要があるので、print_rではすべてのレコードにtype => carが表示され、これをコードで使用できます。

どうやってするか?

そのsomhowをselectに入れることはできますか?

お気に入り:

->select( 
           'items.id as items___item_id',
           'items.item_title as items___item_title',
           'items_categories.id as items_categories___category_id',
           'items_categories.title as items_categories___category_title',
           //something like this?
           'type' = 'car'
        )

今私はこれを手に入れているので:

Array
(
    [0] => stdClass Object
        (
            [items___item_id] => 10
            [items___item_user_id] => 2
            [items___item_title] => A new blue truck
            [items_categories___category_id] => 1
            [items_categories___category_title] => Truck
        )

    [1] => stdClass Object
        (
            [items___item_id] => 11
            [items___item_user_id] => 2
            [items___item_title] => VW Tiguan
            [items_categories___category_id] => 1
            [items_categories___category_title] => SUV
        )

そして私はこれを手に入れたいです:

Array
(
    [0] => stdClass Object
        (
            [items___item_id] => 10
            [items___item_user_id] => 2
            [items___item_title] => A new blue truck
            [items_categories___category_id] => 1
            [items_categories___category_title] => Truck
            [type] => car
        )

    [1] => stdClass Object
        (
            [items___item_id] => 11
            [items___item_user_id] => 2
            [items___item_title] => VW Tiguan
            [items_categories___category_id] => 1
            [items_categories___category_title] => SUV
            [type] => car
        )

可能であれば、モデルファイルではなく、1つのクエリ中に実行します。これは、この変更を行う必要があるのは1回だけだからです。

8
John Doeherskij

この方法を使用できます。

$data = DB::table('items')
   ->Select('items.id as items___item_id',
            'items.item_title as items___item_title');

# Add fake column you want by this command
$data = $data->addSelect(DB::raw("'fakeValue' as fakeColumn"));

$data = $data->orderBy('items.id')->get();

楽しめ!

16
W. Dan

アイテムテーブルのモデルを作成し、その方法でクエリする必要があります。 eloquentを使用すると、$ appendsプロパティに列名を追加してモデル属性を定義することで、その場で列を作成できます。

php artisan make:model Item

すべてのモデルは、モデル名の複数形であるテーブルを自動的に検索します(アイテムは「アイテム」を検索します)。 Itemモデルで、次の行を追加します

/**
 * Append custom columns to the model
 * 
 * @var array
 */
protected $appends = ['type'];

/**
 * Define the type column to every Item object instance
 * 
 * @return string
 */
public function getTypeAttribute()
{
    return 'car';
}

次に、DB :: selectの代わりにモデルを使用するようにクエリを更新します。コントローラの上部にあるモデルを使用してください

use App\Item; 

....

$items = Item::orderBy('created_at', 'desc')
                       ->join('items_categories', 'items.item_category_id', '=', 'items_categories.category_id')
                       ->select( 
                                 'items.id as items___item_id',
                                 'items.item_title as items___item_title',
                                 'items_categories.id as items_categories___category_id',
                                 'items_categories.title as items_categories___category_title',
                               )
                       ->take(20)->get();

モデルを使用してコレクションとDB :: selectを返す場合、最後のメソッドとしてget()を追加する必要があります。

5
Rob Fonseca

これがこの問題の解決策です。将来的に他の人の役に立つことを願っています。

$items = DB::table('items')->orderBy('created_at', 'desc')
                           ->join('items_categories', 'items.item_category_id', '=', 'items_categories.category_id')
                           ->select(DB::raw('"car" AS type, 
                                             items.id as items___item_id,
                                             items.item_title as items___item_title,
                                             items_categories.id as items_categories___category_id,
                                             items_categories.title as items_categories___category_title
                                            ')
                                   )
                           ->take(20);
0
John Doeherskij

このサンプルのように実装します

    $first = Message::where('from_id', '=', Auth::user()->id)
        ->where('to_id', '=', $id)->get();
    foreach ($first as $f)
        $f->is_sent = true;

    $second = Message::where('from_id', '=', $id)
        ->where('to_id', '=', Auth::user()->id)->get();
    foreach ($second as $s)
        $s->is_sent = false;

    $chats = $first->merge($second)
        ->sortBy('created_at');

    return $chats->toJson();

あなたはforeachafter get()メソッドでそれを行うことができます