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回だけだからです。
この方法を使用できます。
$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();
楽しめ!
アイテムテーブルのモデルを作成し、その方法でクエリする必要があります。 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()を追加する必要があります。
これがこの問題の解決策です。将来的に他の人の役に立つことを願っています。
$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);
このサンプルのように実装します
$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()メソッドでそれを行うことができます